给你一个字符串 s,找到 s 中最长的回文子串。
示例:
输入:s = "babad"
输出:"bab"
解释:"aba" 也是一个有效答案。
定义状态:
我们定义一个二维数组dp,其中dp[i][j]表示从i到j的子串是否为回文子串。
状态转移:
如果s[i]等于s[j],并且s[i+1]到s[j-1]也是回文子串,那么dp[i][j]也是回文子串。同时,如果s[i]等于s[j]并且j-i小于等于2,那么dp[i][j]也是回文子串。
具体来说,我们从长度为1的子串开始,逐步增加长度,直到整个字符串。这样我们就可以依次计算出所有长度的子串是否为回文子串。对于每个回文子串,我们记录它的起始位置和结束位置,最终返回最长的回文子串。
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
String res = "";
for (int len = 1; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (len == 1) {
dp[i][j] = true;
} else if (len == 2) {
dp[i][j] = (s.charAt(i) == s.charAt(j));
} else {
dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]);
}
if (dp[i][j] && len > res.length()) {
res = s.substring(i, i+len);
}
}
}
return res;
}