【KMP】串匹配-java代码【最新版本】

串匹配算法大家都不陌生,其中kmp算法算是比较经典的一种算法,然而kmp算法的精髓就是寻找next[ ]数组。

主要是对匹配串的next[ ]一个求解。


package qyq.Algorithm.KMP;
/**
 * KMP串匹配
 * @author qi
 * @creation 2012-8-14  更新至  2012年10月10日15:47:00   之前的有个小bug,现在已经调试通过,希望大家多多交流哈!
 */
public class Kmp {

	public static void main(String[] args) {
		String S="angcdthabc";
		String T="hbc";
		int lenS=S.length();
		int lenT=T.length();
		int next[]=new int[lenT+1];
		
		getNext(T, next);//next[]数组的求解
		for(int i=0;i<next.length;i++){//打印出next数组
			System.err.println(i+":"+next[i]);
		}
		int kmp=K_next(S, T, lenS, lenT, next);
		System.err.println("第一次匹配的位置::"+kmp);
	}
	
	public  static void getNext(String T,int next[]){//这个是重点
		int j=0,k=-1;
		next[0]=-1;
		while(j<T.length()){
			if(k==-1||T.charAt(j)==T.charAt(k)){
				j++;
				k++;
				next[j]=k;
			}else {
				k=next[k];
			}
		}
	}

	public static int K_next(String S,String T,int lenS,int lenT,int next[]){
		int i=0,j=0;
		while(i<lenS&&j<lenT){
			if(j==-1||S.charAt(i)==T.charAt(j)){
				i++;
				j++;
			}else {
				j=next[j];
			}	
		}
		if(j==lenT){
			return i-lenT;
		}
		return -1;
	}
}
  

在求解next[ ]数组的时候,主要是求解字符串T的真前缀和真后缀。

根据上面的公式:

比如  字符串:abcdsdf 

则a的next[ ] 的值设置为o,则b的为1,c的为1,依次是:1,1,1,1,1

如果是:abcabcdas

0,1,1,1,2,3,4,1,2

看明白了吗! 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值