KMP算法--求next数组

我的个人网站www.liujianhua.xyz
最近在学数据结构,三天看了180页pdf,佩服我自己,当然最主要的还是我之前学过链表,所以前面学起来相对快,今天学到了串里面的KMP算法,研究了大半天,看了各种视频与文章,终于理解了,不得不感慨发明这算法的大佬。。
贴上我看的视频与文章链接
知乎文章
B站视频
现在来讲讲KMP算法中next数组的求取。next数组,我相信学过或者了解过KMP算法的对它一定不陌生,可以这样说,整个LMP算法的精髓就在于对next数组的求解。我将用我所看的文章图片或者视频截图为大家通俗易懂的讲,若图片有侵权,联系删除。
如果不用KMP算法,就只能暴力遍历来求解最坏的情况时间复杂度为O(m*n),显然,如果字符串过长,那时间消耗将是相当吓人的。当然,这篇文章不探讨这些,只讲next数组的求解方法。
模板字符串"aabaaf"它的next数组如图:在这里插入图片描述
下面看如何来的
在这里插入图片描述

注意,看相同串时,头从做往右,尾从右往左!还有这种情况,两头使用了中间重复的字符,一定要注意。
然后看代码

int KmpNext(char* pat)
{
	int i, j = 0;
	int next[6] = {0};
	for (i = 1;i <= sizeof(pat);i++)
	{
		while (j > 0 && pat[i] != pat[j])
			j = next[j - 1];
		if (pat[i] == pat[j])
		{
			j++;
			next[i] = j;
		}
	}
	return 0;
}

C语言实现的代码。这还只只最初级的KMP算法next数组,还有进阶版的,后面会更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值