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]);
		}
	}
}
posted @ 2013-07-25 19:18  javawebsoa  Views(284)  Comments(0Edit  收藏  举报