代码改变世界

KMP字符串匹配

2012-09-13 17:22  jiutianhe  阅读(126)  评论(0编辑  收藏  举报

java版本:

package util;

public class KMPStringMatch {
	//KMP字符串匹配
	private int[] getNext(String T){//T为模式串
		int[] next=new int[T.length()];
		int j=1;//
		int k=0;//
		next[0]=-1;
		next[1]=0;
		while (j<T.length()-1) {
			if (T.charAt(j)==T.charAt(k)) {
				next[j+1]=k+1;
				j++;
				k++;
			} else if (k==0) {
				next[j+1]=0;
				j++;
			} else {
				k=next[k];
			}
		}
		return next;
	}
	
	@SuppressWarnings("unused")
	private int[] getNextVal(String T){
		int[] nextval=new int[T.length()];
		int j=0;//
		int k=-1;//
		nextval[0]=-1;
		while (j<T.length()-1) {
			if (k==-1 || T.charAt(j)==T.charAt(k)) {
				j++;
				k++;
				if (T.charAt(j)!=T.charAt(k)) {
					nextval[j]=k;
				} else {
					nextval[j]=nextval[k];
				}			
			} else {
				k=nextval[k];
			}
		}
		return nextval;
	}
	
	public int indexKMP(String S,String T,int start){
		//模式串T与主串S匹配
		int[] next=getNext(T);
		int i=start;//主串指针
		int j=0;//模式串指针
		while (i<S.length()&&j<T.length()) {
			if (j==-1||S.charAt(i)==T.charAt(j)) {
				i++;j++;
			} else {
				j=next[j];
			}
		}
		if (j<T.length()) {
			return -1;//匹配失败
		}else {
			return (i-T.length());//匹配成功
		}
	}
	
	//测试
	public static void main(String[] args) {
		KMPStringMatch ksm=new KMPStringMatch();
		int result=ksm.indexKMP("ababcabcacbab", "abcac", 0);
		System.out.println(result);
	}
}