最长回文子串-Manacher算法实现
package p56;
/**
* 最长回文子串
* @author Guozhu Zhu
* @date 2019/4/13
* @version 1.0
*
*/
public class Manacher01 {
/* ========== Test ========== */
public static void main(String[] args) {
System.out.println(method("abacabacb"));
}
public static int method(String str) {
StringBuilder sb = new StringBuilder();
sb.append('#');
for (int i = 0; i < str.length(); i ++) {
sb.append(str.charAt(i));
sb.append('#');
}
System.out.println(sb.toString());
int[] rad = new int[sb.length()];
int id = -1;
int mx = -1;
for (int i = 0; i < sb.length(); i++) {
int r = 1;
if (i <= mx) {
// r = Math.min(mx-i, rad[2*id-i]);
r = Math.min(rad[id]-i+id, rad[2*id-i]);
}
while (i-r >= 0 && i+r < sb.length() && sb.charAt(i-r) == sb.charAt(i+r)) {
r++;
}
if (i+r-1 > mx) {
mx = i+r-1;
id = i;
}
rad[i] = r;
}
int k = 0;
//找到长度最长回味子串的中点及长度
int maxLength = 0;
for (int j = 0; j < rad.length; j++) {
if (rad[j] > maxLength) {
maxLength = rad[j];
k = j;
}
}
//输出回文子串
String ans = sb.substring((k - maxLength + 1), k + maxLength).replaceAll("#", "");
System.out.println(ans);
return maxLength-1;
}
}