给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
dp 方程
- dp[i][j] 代表i到j是回文串
- dp[i][i]=1;
- if(s[i]==s[i+1]) dp[i][i+1]=1;
- s[i]==s[i+len] && dp[i+1][i+len-1]==1 => do[i][i+len]=1
class Solution {
public String longestPalindrome(String s) {
if(s.equals("")||s.length()==1)
return s;
int [][] dp=new int[s.length()][s.length()];
char []num=s.toCharArray();
int start=0;
int maxLen=1;
for(int i=0;i<s.length();i++)//进行初始化
{
dp[i][i]=1;
if(i+1<s.length()&&num[i]==num[i+1])
{dp[i][i+1]=1; start=i;maxLen=2; }
}
// 必须先把相同字母的回文串去除,然后把len从2开始计算
for(int len=2;len<num.length;len++)
{
for(int i=0;i<num.length;i++)
{
if (i + len < num.length&&num[i] == num[i + len]) {
dp[i][i + len] = dp[i + 1][i + len - 1];//验证dp[i][i+len]是回文串
if (dp[i][i + len] ==1&& len + 1 > maxLen) {//记录下最长回文串的起始位置和长度
maxLen = len + 1;
start = i;
}
}
}
}
return new String(num,start,maxLen);
}
}