思路:
1、把原来的字符串转换成字符数组,再创建一个原来字符数组的转置数组
2、让转置数组和原来的字符数组相向而行,每移动一个单位,比较一次,总共比较2*length-1次,令i的初始值为1,i记录比较次数;当i<=length的时候,比较的长度是i,当i>=length的时候,比较的长度是2*length-i;
3、比较方式:两个字符数组对应的位置进行比较,选出连续重合最多的加入list里面,最后总选出连续重合总数最多的list,把它复制给resultlist。
犯的错误:
1、逻辑错误:比较的方式不对(第一次采用逐个比较,这样的结果是狭窄了范围,没有考虑其他更多的情况;第二次是只比较每次重合以后第一个连续重合的串,忽视了每次比较时,同时存在几个连续重合的串的情况)
2、题意理解的错误:注意回文串的一个重要特点是,这个串它是对称的。
3、语法理解错误:(1)有的串是因为后一个字母不同而结束,有的串是因为没有后一个字母而结束,这两种情况是不一样的。
(2)赋值以后,因为result和cls指向的是同一个对象,所以cls如果clear,那么result也没了。
特别注意的:
用flag来标识串结束的位置(在因后一个字母不同而结束的情况),以方便进行接下来的操作。
public static String longestPalindrome(String s) {
char[] strarr=s.toCharArray();
char[] reversearr=new char[strarr.length];
for(int i=0;i<strarr.length;i++) {
reversearr[i]=strarr[strarr.length-1-i];
}
List<Character> resultls=new ArrayList<Character>();
int rslength=0;
for(int i=1;i<2*strarr.length;i++) {
boolean flag=false;
List<Character> cls=new ArrayList<Character>();
if(i<=strarr.length) {
char current=strarr[0];
int k=0;
int comparelength=i;
for(int j=0;j<comparelength;j++) {
current=strarr[k];
char comparechar=reversearr[reversearr.length+j-i];
if(current==comparechar) {
cls.add(current);
flag=true;
k++;
}else {
if(flag) {
if(cls.size()>=rslength&&checkSymmetric(cls)) {
rslength=cls.size();
resultls=cls;
}
cls=new ArrayList<Character>();
}
k++;
}
}
if(cls.size()>=rslength&&checkSymmetric(cls)) {
rslength=cls.size();
resultls=cls;
}
}
else {
char current=strarr[i-strarr.length];
int comparelength=2*strarr.length-i;
int k=0;
for(int j=0;j<comparelength;j++) {
char comparechar=reversearr[k];
current=strarr[i+j-strarr.length];
if(current==comparechar) {
cls.add(current);
flag=true;
k++;
}else {
if(flag) {
if(cls.size()>=rslength&&checkSymmetric(cls)) {
rslength=cls.size();
resultls=cls;
}
cls=new ArrayList<Character>();
}
k++;
}
}
if((cls.size()>=rslength)&&checkSymmetric(cls)) {
rslength=cls.size();
resultls=cls;
}
}
}
String ss="";
for(int i=0;i<resultls.size();i++) {
ss=ss+resultls.get(i).toString();
}
return ss;
}
public static boolean checkSymmetric(List<Character> ls) {
int length=ls.size();
for(int i=0;i<length/2;i++) {
char char1=ls.get(i);
char char2=ls.get(length-i-1);
if(char1!=char2)
return false;
}
return true;
}