一、概要
二、算法实现
/**
* 最大需要回文串的长度
* @author superman
*
*/
public class Manacher {
public static char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * + ];
int index = ;
for (int i = ; i != res.length; i++) {
res[i] = (i & ) == ? '#' : charArr[index++];
}
return res;
}
public static int maxLcpsLength(String str) {
if (str == null || str.length() == ) {
return ;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -;
int pR = -;
int max = Integer.MIN_VALUE;
for (int i = ; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[ * index - i], pR - i) : ;
while (i + pArr[i] < charArr.length && i - pArr[i] > -) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]);
}
return max - ;
}
public static void main(String[] args) {
String str1 = "abc1234321ab";
System.out.println(maxLcpsLength(str1));
}
}
/**
* 返回添加的回文串
* @author superman
*
*/
public class Manacher_ShortestEnd {
public static char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * + ];
int index = ;
for (int i = ; i != res.length; i++) {
res[i] = (i & ) == ? '#' : charArr[index++];
}
return res;
}
public static String shortestEnd(String str) {
if (str == null || str.length() == ) {
return null;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -;
int pR = -;
int maxContainsEnd = -;
for (int i = ; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[ * index - i], pR - i) : ;
while (i + pArr[i] < charArr.length && i - pArr[i] > -) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
if (pR == charArr.length) {
maxContainsEnd = pArr[i];
break;
}
}
char[] res = new char[str.length() - maxContainsEnd + ];
for (int i = ; i < res.length; i++) {
res[res.length - - i] = charArr[i * + ];
}
return String.valueOf(res);
}
public static void main(String[] args) {
String str2 = "abcd123321";
System.out.println(shortestEnd(str2));
}
}