定义dp[i][j]
的含义为i到j位置是否为回文子串,状态转移方程为:
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
String ans = "";
boolean[][] dp = new boolean[n][n]; //dp[i][j]表示从i到j是否为回文子串
for (int i = n-1; i >= 0; i--){ //注意:i要反向遍历,因为下面会出现dp[i+1][j-1]
for (int j = i; j < n; j++){
//只有一个字符,一定是回文子串
if (i == j){
dp[i][j] = true;
}
//2个字符,判断是否相等
else if(j == i+1){
dp[i][j] = s.charAt(i) == s.charAt(j);
}
else{
//三个字符及以上:看s[i]和s[j]是否相等且去掉头尾的子串是否回文
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i+1][j-1];
}
//y有更长的就更新结果
if(dp[i][j]){
if (j - i + 1 > ans.length()){
ans = s.substring(i, j + 1);
}
}
}
}
return ans;
}
}
精简版:
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int interval= 0; //间隔
int start = 0; //开始位置
for (int i = n-1; i >= 0; i--){
for (int j = i; j < n; j++){
// 2个以下字符
if (j - i < 2){
dp[i][j] = s.charAt(i) == s.charAt(j);
} else {
dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
}
if (dp[i][j] && interval <= j - i + 1){
start = i;
interval = j - i + 1;
}
}
}
return s.substring(start, start + interval);
}
}