回文字符串是正反读都一样。本文是求字符串最长回文字符串
我有两种思路:
1. 从当前字符开始,两个索引一个向后,一个向前 ,比较字符。这有分为两种情况,一个是回文字符串长度为偶数,一个是回文字符串长度为奇数。比如 "abba","aba", 偶数个时中心在字符bb中间,奇数个时在b位置。因此需要考虑两种情况。遍历时,那种情况的回文字符串长度大就返回那个回文字符串。
2.通过字符串中每个字符中嵌入”#“字符,如上"#a#b#b#a#","#a#b#a#",这样就不要分成两种情况考虑
第一种思路,代码也不难,代码也没有写,这里粘贴第二个思路的代码
public int maxLcpsLength(String str) {
if (str == null || str.length() == 0) {
return 0;
}
char[] charArr = manacherString(str);
System.out.println(charArr);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
// 2 pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1;
pArr[i] = 1; // 1 ,种
while (i + pArr[i] < charArr.length && i - pArr[i] > -1) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
// 2 if (i + pArr[i] > pR) {
// 2 pR = i + pArr[i];
// 2 index = i;
// 2 }
max = Math.max(max, pArr[i]);
}
return max - 1;
}
代码中注释的2,是网上的原来的代码,搞的有点复杂,我把它替换成1,至于网上为什么这样写,没有理解,可能自己有些东西还没了解或者不知道。