一开始的错误想法
后缀数组法:把S倒置过来得到S’,然后将他们拼接在一起得到字符串T,在T的最中间插入一个字符串中没有的符号+,遍历这个字符串T,发现加号之前有跟后面一毛一样的子字符串,输出。错误点:对于ABCDETFDCBA这样的字符串,遍历得出的最长回文子串将会是ABCD,但实际上最长子串长度仅为1.
动态规划法
对于所给的字符串s,假设dp[i][j]=true表示字符串s[i...j]是回文子串,那么dp[i+1...j-1]必定也为true。则求解最长回文子串就可以分解成一系列子问题,并通过动态规划来求解了。
public String longestPalindrome(String s) {
if(s==""||s.length()==0)
return s;
int[][] dp=new int[s.length()][s.length()];
int i=0,j=0;
int start=0;
int end=0;
int maxlen=0;
for( i=s.length()-1;i>=0;i--)
{
for(j=i;j<s.length();j++){
//单个字符一定是回文串
if(i==j){
dp[i][j]=1;
}
//如果是两个相邻且相同的字符一定是回文串
if(i+1==j&&s.charAt(i)==s.charAt(j)){
dp[i][j]=1;
// System.out.println(s.charAt(i));
}
//最左边和最右边的字符是一样的并且两边的字符是一样的,那么这是一个回文串
//右边界要大于0,即字符串长度不可能为负数,左边界不能超出字符串长度
if(i+1<s.length()&&j-1>0&&dp[i+1][j-1]==1&&s.charAt(i)==s.charAt(j)){
dp[i][j]=1;
}
//如果判断出是回文串并且当前记录的长度小于最长回文串的长度
if(dp[i][j]==1&&maxlen<j-i+1){
start=i;
end=j;
maxlen=j-i+1;
}
}
}
//System.out.println(maxlen);
return s.substring(start,end+1);
}