KMP代码分布详解


前言

自从我学了串之后,知道了BF(爆破型算法)发现时间复杂度不是很理想,在研究过KMP算法之后,才知道原来先辈的思想这么好,并且我也希望已经出现的算法,自己研究透彻。
【天勤公开课】KMP算法简单易懂版
这个链接可以帮助大家更好的理解关于这部分的KMP内容,由于自己不会做动画,所以就先请大家移步了

代码部分

void get_next(String T, int *next) 
{
	int i,k;
  	i=1;
  	k=0;
  	next[1]=0;
  	while (i<T[0])  /* 此处T[0]表示串T的长度 */
 	{
    	if(k==0 || T[i]== T[k]) 
		{
      		++i;  
			++k;  
			next[i] = k;
    	} 
		else 
			k= next[k];	/* 若字符不相同,则k值回溯 */
  	}
}

代码分布解释

首先我们有这样一个字符串

0123456
abcabx

其中根据代码中,我们可以知道i=1 k=0 next[1]=0


进入循环

第一步

因为 k=0

则进入 if 判断 满足 k==0

此时 ++i ++k i=2 k=1

0123456
i
abcabx

next[2]=1

第二步

因为 k=1

进入 if 判断 T[i] ≠ T[k]

则 k 进入 else

此时 k = next[k] = next[1] = 0

第三步

因为 k=0

则进入 if 判断 满足 k==0

此时 ++i ++k i=3 k=1

0123456
i
abcabx

next[3]=1

第四步

因为 k=1

进入 if 判断 T[i] ≠ T[k]

则 k 进入 else

此时 k = next[k] = next[1] = 0

第五步

因为 k=0

则进入 if 判断 满足 k==0

此时 ++i ++k i=4 k=1

0123456
i
abcabx

next[4]=1

第六步

因为 k=1

则进入 if 判断 满足 T[i]==T[k]

此时 ++i ++k i=5 k=2

0123456
i
abcabx

next[5]=2

第七步

因为 k=2

则进入 if 判断 满足 T[i]==T[k]

此时 ++i ++k i=6 k=3

0123456
i
abcabx

next[6]=3

退出循环

因为 i=6

不满足 while (i<T[0]) //T[0]表串长度

则退出循环

评论 102
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值