1. manacher算法 22ms
public class Solution {
private int min(int a, int b){
return a < b ? a : b;
}
public String longestPalindrome(String s) {
if (null == s || 0 == s.length()) {
return "";
}
int len = (s.length() << 1) + 1;
char[] srcString = new char[len];
for (int i = 0; i < len; i++) {
if (0 == i % 2) {
srcString[i] = '~';
} else {
srcString[i] = s.charAt(i >> 1);
}
}
int ansIdx = 0;
int mxIdx = 0;
int mx = 0;
int[] p = new int[len];
for (int i = 0; i < len; i++) {
if (mx < i) {
p[i] = 1;
} else {
p[i] = min(p[(mxIdx << 1) -i], mx - i);
}
while (len > i + p[i] && 0 <= i - p[i]) {
if (srcString[i + p[i]] == srcString[i - p[i]]) {
p[i]++;
}else{
break;
}
}
if ( p[i] + i - 1 > mx){
mx = p[i] + i - 1;
mxIdx = i;
}
if (p[i] > p[ansIdx]){
ansIdx = i;
}
}
int start = ansIdx + 1 - p[ansIdx];
int end = ansIdx + p[ansIdx] - 1;
return s.substring(start >> 1, end >> 1);
}
}