public static String longestPalindrome1(String s) {
int startAndEnd[] = new int[2];
for (int i = 0; i < s.length(); i++) {
getMaxSubStr(s, startAndEnd, i, i);//奇
getMaxSubStr(s, startAndEnd, i, i + 1);//偶
}
return s.substring(startAndEnd[0], startAndEnd[1]);
}
private static void getMaxSubStr(String s, int[] startAndEnd, int start, int end) {
for (; start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end); ) {
start--;
end++;
}
if (end - start - 1 > startAndEnd[1] - startAndEnd[0] + 1) {
startAndEnd[0] = start + 1;
startAndEnd[1] = end;//前包后不包
}
}
public String longestPalindrome(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1;
String res = s.substring(0, 1);
// 中心位置枚举到 len - 2 即可
for (int i = 0; i < len - 1; i++) {
String oddStr = centerSpread(s, i, i);
String evenStr = centerSpread(s, i, i + 1);
String maxLenStr = oddStr.length() > evenStr.length() ? oddStr : evenStr;
if (maxLenStr.length() > maxLen) {
maxLen = maxLenStr.length();
res = maxLenStr;
}
}
return res;
}
private String centerSpread(String s, int left, int right) {
// left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数
// right = left + 1 的时候,此时回文中心是一个空隙,回文串的长度是偶数
int len = s.length();
int i = left;
int j = right;
while (i >= 0 && j < len) {
if (s.charAt(i) == s.charAt(j)) {
i--;
j++;
} else {
break;
}
}
// 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),因此不能取 i,不能取 j
return s.substring(i + 1, j);
}
String aa = "cababad";
int ret[] = new int[2];
for (int i = 0; i < aa.length(); i++) {
abc(i, i + 1, aa, ret);
abc(i, i, aa, ret);
}
System.out.println();
public static void abc(int left, int right, String s, int ret[]) {
for (; left >= 0 && right < s.length(); ) {
if (s.charAt(left) == s.charAt(right)) {
left--;
right++;
} else
break;
}
if ((right - 1) - (left + 1) + 1 > ret[1]) {
ret[0] = left + 1;
ret[1] = (right - 1) - (left + 1) + 1;
}
}