题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
动态规划解法
- 建立一个二维数组
d
,令d[j][i]
表示s[j...i] = true
是回文字符串,用其等于false
则表示不是回文子串 - 由上面的定义就可以知道,如果
s.charAt(j)==s.charAt(i)
并且d[j+1][i-1]
里面是true
,则dp[j][i]
也为true
- 先将数组初始化,即相邻两个相同的字母(如
"aa"
)组成的子串和单个的字母都是回文串 - 之后再从最长回文子串为3开始筛选
- 如果长度比已知的最长回文子串长,那么就更新最长回文子串
代码
class Solution {
public String longestPalindrome(String s) {
//动态规划法
int len = s.length();
if(len<1) return s;
boolean[][] p = new boolean[len][len];
String res = s.substring(0,1);
// 注意:j<=i,从第i位开始,逐渐向0,依次判断。
for(int i=0; i<len; i++){
for(int j=i;j>=0;j--){
p[j][i] = ((s.charAt(j) == s.charAt(i)) && ((i-j<3) || p[j+1][i-1])) ;
if(p[j][i] && (i-j+1)>res.length())
res = s.substring(j,i+1);
}
}
return res;
}
}