KMP算法之Next数组如何计算

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/shipsail/article/details/102723116

KMP算法之Next算法之如何计算

简的描述

K,J为两个“指针”,K指向前缀,J指向后缀。
当P[K]==P[J],则 K++,J++,匹配下一个字符
当P[K]!=P[J],则K=next[K],进行回溯

抛出疑问

为啥回溯K呢???

因为从左到右,前缀是固定的,后缀会随J++发生巨大的变化

next是怎么定义的??
例如next[K],指的是下标为K个字符前的最长相同前后缀的长度。有点拗口,但是看过KMP算法的原理应该懂这是啥。

所以看懂下面的图

本来想录视频滴,实在太害羞就没录

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

最简单的实现

void getNext(string &p,int next[]){
	int k=-1,j=0;//初始化
	while(j < p.length() - 1){
		if(k == -1 || p[k] == p[j]){//匹配下一个
			k++;j++;
			next[j]=k;
		}else k = next[k];//回溯
	}
}

当然这不是最完善的版本,还有改善的空间,我还没看透…
所以等我看透了再发。

猜你喜欢

转载自blog.csdn.net/shipsail/article/details/102723116