给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
思路 : 先给出状态转移方程,然后分别由备忘递归或者dp求解;本题中,对于任意的两个合法下标 i -
j,table[i][j] = table[i+1][j-1] && (s[i] == s[j])
, 考虑边缘情况,由于这个表达式只能适用于长度 >= 3的字符串,考虑长度 == 1的字符串,table[i][i] = true
,考虑长度 == 2 的字符串 : table[i][j] = s[i] == s[j]
,考虑到求解table[i][j]
时使用了i - j之间的子问题的最优解,因此必须从长度 == 1逐渐求解到长度 == n
这个求解方式类似于矩阵链乘法问题或者最优二叉搜索树问题
code :
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
boolean[][] table = new boolean[len][len];
String ret = "";
for (int l = 1; l <= len; l++) {
for (int i = 0; i < len - l + 1; i++) {
//fetch the end of the substring
int j = i + l - 1;
if (l == 1) {
table[i][j] = true;
}else if (l == 2) {
table[i][j] = s.charAt(i) == s.charAt(j);
}else {
table[i][j] = table[i+1][j-1] && (s.charAt(i) == s.charAt(j));
}
if(table[i][j] && s.substring(i,j + 1).length() > ret.length()) {
ret = s.substring(i,j + 1);
}
}
}
return ret;
}
}