Manacher算法(最大回文子串),JAVA實現

推薦大家一個視頻。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());
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章