比如一个字符串abcdcbe,则最长的回文子串就应该使bcdcb,即按顺序,倒序读都是一样的。
中心扩展法思路:一个子串是回文序列那么它必定是关于中心点对称的,所以只要找到了中心点,再逐一比较它的前后两个字符,相等就继续延申,不相等就退出找下一个“中心点”。
可能存在的问题:对于中间有连续的字符dcffg,像这样的字符串如果按照上述方法来找就无法找到,但ff是符合条件的,解决的办法就是将字符的左右都加上一个相同的字符‘*’,即字符串的长度变长为2n+1,最后再通过一定的判断就能截取出对应的回文序列。
class Solution {
public String longestPalindrome(String s) {
int len=0;
StringBuffer temp = new StringBuffer();
String fin="";
if(s.length()==1){
return s;
}
//将所有的字符左右都加上一个相同的字符
for(int i=0;i<s.length();i++){
temp.append("*");
temp.append(s.charAt(i));
}
temp.append("*");
char []str=temp.toString().toCharArray();//将
for(int i=0;i<str.length-2;i++){
int temp2=0;
for(int j=0;j<=i&&j<=(str.length-i-1);j++){//因为只需要比较该中心点左右两边最段的距离(回文序列是对称的)
if(str[i-j]==str[i+j]){//
temp2++;//用一个变量来记录长度,这个长度不是真正的截取的字符串的长度,只是为了比较而已。
if(temp2>len)//如果长度大于以前的长度
{
if(str[i] != '*'){//判断也是为了解决两个字符连着的问题,这只是一个发现的规律而已,当中心点不为*的时候
fin=s.substring((i-1)/2-j/2, (i-1)/2+j/2+1);
}
else{//当中心点为*的时候
fin=s.substring((i-1)/2-j/2+1, (i-1)/2+j/2+1);
}
len=temp2;
}
}
else{//若左右不相等,则寻找下一个中心点
break;
}
}
}
return fin;
}
}