描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路分析:
1、求最值、使用动态规划
2、最后一步:找出最长的回文子串a[i…j
3、转移方程:f[ i ][ j ] = f[ i + 1][ j - 1] and a[ i ] == a[ j ] ;表示从下标i到j构成回文子串,设为true
4、需要注意考虑 i + 1 < j - 1的情况
补充:此题同样可以使用从中心扩散的方法,但是动态规划更具有普遍性
ps:时间复杂度和空间复杂度都还有待提高
代码实现:
class Solution {
public String longestPalindrome(String s) {
int idx = 0;
int len = 0;
char[] c = s.toCharArray();
int n = s.length();
boolean dp[][] = new boolean[n][n];
for (int i = n; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (i + 1 >= j - 1) {
dp[i][j] = c[i] == c[j] ? true : false;
} else {
dp[i][j] = (dp[i + 1][j - 1] && c[i] == c[j]) ? true : false;
}
if (dp[i][j] == true) {
if (j - i + 1 > len) {
idx = i;
len = j - i + 1;
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = idx; len > 0; len--) {
sb = sb.append(c[i++]);
}
return sb.toString();
}
}