最长回文子串(Longest Palindromic Substring)-DP问题
问题描述:
给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 。
思路分析:
动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。
则根据回文的规则我们可以知道:
如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]
当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。
动态规划的进行是按照字符串的长度从1 到 n推进的。
DP算法实现:
package com.ysw.test; import java.util.Scanner; /*
* 问题描述:
* 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,
* 而且存在唯一的最长回文子串 。
*/
public class LongestPalindrome { /**
* @param args
*/
public static void main(String[] args) {
// 从键盘读入字符串
String str = null;
Scanner reader = new Scanner(System.in);
str = reader.nextLine();
System.out.println(getLongestPalindrome(str));
} /**
* 此方法返回s的最长回文串
*
* @param str
* @return
*/
private static String getLongestPalindrome(String str) { boolean dp[][];
// 如果字符串的长度为0,则认为str的最长回文串为空字符串
if (str.length() == 0) {
return "";
}
// 字符串str长度为1.则字符串本身就是一个最长回文串
if (str.length() == 1) {
return str;
}
// dp[i][j],表示字符串str从str[i]到str[j]的子串为最长回文子串
dp = new boolean[str.length()][str.length()];
// 记录已经找到的最长回文子串的长度
int maxLen = 1;
// 记录最长回文子串的起点位置和终点位置
int start = 0, end = 0;
// 动态规划的进行是按照字符串的长度从1 到 n推进的,k表示正在判断的子串的长度
// 用于和已知的子串的长度maxLen进行比较
int k;
// 找出str的所有子串的dp对应的boolean值,初始化过程
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < str.length(); j++) {
// 当i==j的时候,只有一个字符的字符串
// 当i>j的时候认为是空串,dp[i][j]
if (i >= j) {
dp[i][j] = true;
} else {
dp[i][j] = false;
}
}
} // 我在这里犯了一个幼稚的错误,把i、j的定义放在了for循环中,在else{}中是访问不到的
// 运行程序报java.lang.StringIndexOutOfBoundsException: String index out of
// range错误
int i, j;
for (k = 1; k < str.length(); k++) {
for (i = 0; i + k < str.length(); i++) { j = i + k;
if (str.charAt(i) != str.charAt(j)) {
dp[i][j] = false;
} else {
dp[i][j] = dp[i + 1][j - 1];
if (dp[i][j]) {
// 判断找到的子串的长度是否大于我们已知的最长子串的长度
if (k + 1 > maxLen) {
// 记录最长回文子串
maxLen = k + 1;
// 记录子串的起始位置,因为后面的函数subString(int beginIndex,int
// endIndex)函数要用到
start = i;
end = j;
}
}
}
}
}
return str.substring(start, end + 1);
}
}
【注意】:函数subString返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
最长回文子串(Longest Palindromic Substring)-DP问题的更多相关文章
- [译+改]最长回文子串(Longest Palindromic Substring) Part II
[译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...
- [译]最长回文子串(Longest Palindromic Substring) Part I
[译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...
- 领扣-5 最长回文子串 Longest Palindromic Substring MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode.5-最长回文子串(Longest Palindromic Substring)
这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...
- 【算法】最长回文子串 longest palindrome substring
对于字符串S, 要找到它最长的回文子串,能想到的最暴力方法,应该是对于每个元素i-th都向左向右对称搜索,最后用一个数组span 记录下相对应元素i-th为中心的回文子串长度. 那么问题来了: 1. ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 转载:LeetCode:5Longest Palindromic Substring 最长回文子串
本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindr ...
随机推荐
- Mac + IDEA + JRebel破解方法.
[重要提示]---最佳人生 一.只推荐当计算机无法访问互联网时使用本破解文件. 二.如果可以访问互联网,建议直接到JRebel官网注册JRebel会员获取[正版永久免费]使用的授权码.JRebel会员 ...
- [UVA796]Critical Links(割边, 桥)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Windows下搭建Mysql集群
Mysql集群的基本架构如下: 基本原理参考:[转]MySQL Cluster (集群)基本原理 这里采用最小配置,用两台机器来分别部署一个management 节点,2个data node, 2个s ...
- 字符串模式匹配sunday算法
文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...
- ZigZag Conversion1
问题描述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...
- LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
题意:有一个有序序列A,其内部可能有部分被旋转了,比如A[1...n]被转成A[mid...n]+A[1...mid-1],如果被旋转,只有这种形式.问最小元素是?(假设没有重复元素) 思路:如果是序 ...
- jQuery的威力
jQuery如此之好用,和其在获取对象时使用与CSS选择器兼容的语法有很大关系,毕竟CSS选择器大家都很熟悉(关于CSS选择器可以看看十分钟搞定CSS选择器),但其强大在兼容了CSS3的选择器,甚至多 ...
- 【打表】HDOJ-2089-不要62
[题目链接:HDOJ-2089] 多组测试数据,所以可以先算出符合条件的所有数保存数组中,输入时则直接遍历数组. #include<iostream> #include<cstrin ...
- 【转】如何在eclipse里关联查看android源码
原文网址:http://fengbohaishang.blog.51cto.com/5106297/1339556 以前没怎么注意过这个问题,不怎么看源码,现在发现源码确实是很好的学习资源. 直入正题 ...
- 配置ORACLE 客户端连接到数据库
--================================= -- 配置ORACLE 客户端连接到数据库 --================================= Oracle ...