给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
/**
* 最长回文子串
* @param s
* @return
*/
public static String longestPalindrome(String s) {
int len = s.length();
String ans = "";
boolean[][] p = new boolean[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j + i < len; j++) {
int k = j + i;
if (i == 0) {
p[j][k] = true;
} else if (i == 1) {
p[j][k] = s.charAt(j) == s.charAt(k);
} else {
p[j][k] = p[j + 1][k - 1] && (s.charAt(j) == s.charAt(k));
}
if (p[j][k] && k-j+1 >= ans.length()) {
ans = s.substring(j, k + 1);
}
}
}
return ans;
}
使用动态规划的思想, p[i][j]保存s字符串从i到j是否为回文串:
1、子串大小为1,永远是回文串。
2、子串大小为2,判断两个字符串是否是相等。
3、子串大小大于2时,p[j][k] = p[j + 1][k - 1] && (s.charAt(j) == s.charAt(k));