33,007
社区成员
发帖
与我相关
我的任务
分享
public static String getPalindrome(String str) {
char[] strArr = str.toCharArray();
char[] newStrArr = new char[2 * str.length() + 1];
for (int i = 0; i < newStrArr.length; i++) {
if (i % 2 == 0) {
newStrArr[i] = '0';
} else {
newStrArr[i] = strArr[i / 2];
}
}
int[] radiiArr = new int[newStrArr.length];
int maxRadii = 1;
int center = 1;
int radii = 1;
loop: while (center < radiiArr.length) {
while (center + (++radii) < newStrArr.length && center - radii >= 0
&& newStrArr[center + radii] == newStrArr[center - radii])
;
radiiArr[center] = --radii;
maxRadii = radiiArr[center] > radiiArr[maxRadii] ? center
: maxRadii;
if (radiiArr[center] == 0) {
center++;
radii = 0;
} else {
for (int index = center - 1; index >= center - radiiArr[center]; index--) {
if (center - radiiArr[center] < index - radiiArr[index]) {
radiiArr[2 * center - index] = radiiArr[index];
} else if (center - radiiArr[center] > index
- radiiArr[index]) {
radiiArr[2 * center - index] = index - center
+ radiiArr[center];
} else {
center = 2 * center - index;
radii = radiiArr[index];
continue loop;
}
}
center = center + radiiArr[center];
radii = 0;
}
}
int radd = radiiArr[maxRadii] / 2;
char[] ch = new char[newStrArr.length / 2];
if (newStrArr[maxRadii] == '0') {
ch = new char[2 * radd];
} else {
ch = new char[2 * radd + 1];
}
for (int i = 0; i < ch.length; i++) {
ch[i] = newStrArr[maxRadii - radiiArr[maxRadii] + 2 * i + 1];
}
return new String(ch);
}