KMP快速模式匹配的java實現

假期實在無聊賴啊。把這個算法實現了一下即算是打發時間也算練練手了。

KMP算法的關鍵是用歸納法計算失敗函數。網上很詳細了。下面直接給出代碼。

/**
 * 
 * @author Vincent
 *
 */
public class PatternMap {
	private String pat; //模式
	private int [] f; //模式對應的失敗函數
	private String source; //目標
	PatternMap(String p,String s){ pat=p;source=s;f=new int[pat.length()];  }
	int KMP_FastFind(){
		Fail();
		int p=0,s=0;
		int m=pat.length(),n=source.length();
		while(p<m&&s<n){
			if(pat.charAt(p)==source.charAt(s)){
				p++;s++;
			}
			else if(p==0)s++;
			else
				p=f[p-1]+1;
		}
		if(p<m)
			return -1;
		return s-m; //下標從0開始
	}
	void Fail(){
		int m=pat.length();
		f[0]=-1;
		int i=0;
		for(int j=1;j<m;j++){
			i=f[j-1];
			while( (pat.charAt(j)!=pat.charAt(i+1)) && (i>0) ){
				i=f[i];
			}
			if(pat.charAt(j)==pat.charAt(i+1)){
				f[j]=i+1;
			}
			else f[j]=-1;
		}
	}
	public static void main(String[] args){
		PatternMap pm=new PatternMap("vince_iamvincent","vincevince_iamvincentaaa");
		System.out.println(pm.KMP_FastFind());
		/*
		 * print 失敗函數
		 */
		int m=pm.pat.length();
		for(int i=0;i<m;i++){
			System.out.println(pm.f[i]);
		}
	}
}
發佈了40 篇原創文章 · 獲贊 381 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章