题目

思路
- 用dp[i][j]表示从i到j是否为回文子串
代码
public static String longestPalindrome(String s) {
if(s.length()==1) return s;
//构建dp数组
int[][] dp = new int[s.length()][s.length()];
//对角线赋值
for(int i=0;i<s.length();i++){
dp[i][i]=1;
}
//最长回文子串的开头 和长度
int start=0;
int maxlength=0;
//开始给dp数组赋值
for(int k=1;k<s.length();k++){ //k为dp[i][j]的差值
for(int i=0;i+k<s.length();i++){
//给dp[i][i+k]赋值(i+k=j)
if(k==1 || k==2) {
if(s.charAt(i)==s.charAt(i+k)){
dp[i][i+k]=1; //只用判断该位置的字符相不相等即可
if(k>maxlength){
start=i;
maxlength=k;
}
}
else dp[i][i+k]=0;
}//如果都不等于 首先判断相不相等
else{
if(s.charAt(i)!=s.charAt(i+k)) dp[i][i+k]=0;
else{
if(dp[i+1][i+k-1]==1){ //是1的话
dp[i][i+k]=1;
if(maxlength<k){
start=i;
maxlength=k;
}
}
else dp[i][i+k]=0;
}
}
}
}
//返回即可
return s.substring(start,start+maxlength+1);
}