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]);

		}

	}

}

你可能感兴趣的:(java实现)