kmp算法之next数组求解

相信来的同学对于kmp算法有了解那么就单独说一下next数组如何求解:

对于一个字符串a b d f a b d b;

                 下标 0 1 2 3 4 5 6 7;

我们先对其演示一下next数组的过程;

1:int next[10050]; next[i]的意义代表第i+1个元素结尾的字符串的前后缀相等的最大值的个数;例如:next[4]:代表a b d f a;前后缀相等就一个a,则next[4]=1;同理对于next[5]:a b d f a b。

前后缀都有ab,则next[5]=2;

2:现在开始演示,定义两个指针i=1,j=0。

(1):j=0,i=1。m[i]!=m[j],next[1]=0,i++。

(2)j=0,i=1,m[i]!=m[j],next[2]=0,i++;

以此类推一直到m[i]==m[j],此时next[i]==j+1;

再走到m[i]!=m[j]时,应该怎么办呢,对于这个a b d f a b d b;

next数组0 0 0 0 1 2;

此时i=2,j=6,m[j]!=m[i];此时应该进行回退,即j=next[j-1];

 0 1 2 3 4 5 6 7 8 9;不代表数字代表数组下标。

例如,如果i=9;j=4;不相等进行回溯,如果next[8]=4;代表前9个有4个匹配,即0 1 2 3 匹配5 6 7 8;此时如果第5个和第10个相等next[9]=5;如果不相等的话找next[j-1];即next[3],

如果next[3]=2;代表0 1和2 3匹配,此前 0 1 2 3和 5 6 7 8匹配,即0 1和 2 3 和5 6和7 8相等此时如果第3个和第10个匹配next[9]=3;

你还可以假设其他情况,演算。

	int j=0;
	for(int i=1;i<l1;i++){
		while(j>0&&m[i]!=m[j]){
			j=kmp[j-1];
		}
		if(m[i]==m[j]){
			j++;
		}
		kmp[i]=j;
	}
	j=0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值