class Solution {
public String longestPalindrome(String s) {
int len=s.length();
if(len<1){
return "";
}
int res=1,start=0;
int[][] dp=new int[len][len];
for(int i=0;i<len;i++){
dp[i][i]=1;
if(i<len-1){
if(s.charAt(i)==s.charAt(i+1)){
dp[i][i+1]=1;
start=i;
res=2;
}
else{
dp[i][i+1]=0;
}
}
}
for(int i=2;i<len;i++){
for(int j=0;j+i<len;j++){
if(s.charAt(j)==s.charAt(i+j)&&dp[j+1][i+j-1]==1){
dp[j][i+j]=1;
start=j;
res=i+1;
}else{
dp[j][i+j]=0;
}
}
}
return s.substring(start,start+res);
}
}
此题使用动态规划思想,当dp[i+1][j-1]=1&&s[i]==s[j],则dp[i][j]=1,表示s(i,j)为回文串。
上面的一个for循环初始化dp数组,判断字符串s每两个字符是否为回文串。
下面的两个for循环,分别判断字符串S每k个字符是否为回文串(k=3,4,5,…S.length),记录下最大的回文串长度和该长度的所有回文串中最靠近S末尾的回文串的起始索引。最后返回这个回文串。