推荐大家一个视频。http://www.bilibili.com/video/av4829276/index_1.html。讲manacher算法的。看了好几个博文都不太理解,最后搜了一下视频。很有帮助。
package study.lei.string;
import java.util.Scanner;
public class Manacher {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String inStr = in.nextLine();
manacher(inStr);
}
public static void manacher (String str){
char [] cStr = str.toCharArray();
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("#");
for (int i = 0; i < cStr.length; i++) {
sBuffer.append(cStr[i]);
sBuffer.append("#");
}
int id =0;
int max = 0;
int p[]= new int[sBuffer.length()];
for (int i = 1; i < sBuffer.length(); i++) {
if (i<max) {
p[i] = Math.min(p[2*id-i], max-i);
}else {
p[i]= 1;
}
while (i-p[i]>=0&&i+p[i]<sBuffer.length()&&sBuffer.charAt(i-p[i])==sBuffer.charAt(i+p[i])) {
p[i]++;
}
if (i+p[i]>max) {
max = i+p[i];
id = i;
}
}
int maxl = 0 ;
int maxid =0 ;
for(int i =0 ;i<p.length;i++){
if(maxl<p[i]){
maxl=p[i];
maxid = i;
}
//半径包括id本身。id到第一个元素,id-r+1
int r = maxl-1;
int start = maxid-r+1;
int end = maxid+maxl-1;
StringBuffer out = new StringBuffer();
for (int i = start; i < end; i++) {
if (sBuffer.charAt(i)!='#') {
out.append(sBuffer.charAt(i));
}
}
System.out.println("最大回文子串长度:"+ (maxl-1)+"\n内容为:"+out.toString());
}
}
ps:今天看了一早上,还是没怎么懂。。。
推荐给大家一篇讲解Manacher的博客 https://blog.csdn.net/dyx404514/article/details/42061017
转载自:https://blog.csdn.net/w5761499123/article/details/61420768