对于KMP的next数组的新发现,好像我们并不用回溯

目录

前言

发现

总结


博客主页:张栩睿的博客主页

欢迎关注:点赞+收藏+留言

系列专栏:c语言学习

        家人们写博客真的很花时间的,你们的点赞和关注对我真的很重要,希望各位路过的朋友们能多多点赞并关注我,我会随时互关的,欢迎你们的私信提问,也期待你们的转发!

        希望大家关注我,你们将会看到更多精彩的内容!!!

前言

        学了一个下午的KMP算法,一直弄不明白为什么next数组的那个回溯:k=next[k],喜欢钻牛角尖的我一直到处查啊查啊,但是当我仔细观察next数组,并多举了几个例子以后,才发现回溯的意义。

发现

        通过大量的举例子发现,next数组,要么就是0 0 0 0,要么就是0 1 2 3...递增之后,直接跳回0或1,元素0后面的元素,会非递减,元素1后面的元素,不是0就是2,非0元素后面,要么是直接变为0或1,要么就递增。想到这里,我就发现如果在递增的时候发生不相同的情况,发生回溯,就会一直回溯到首元素,因为我们会惊奇的发现元素通过回溯,他的值没有发生改变!所以代码我们可以写成这样,就不用回溯了!因为回溯的本质就是找到首元素!

​​​​​​​

        从这里我们就可以看到这些规律 

void GetNext(int* next, char* sub)
{
	next[0] = -1;
	if (strlen(sub) == 1)
		return;
	next[1] = 0;
	int k = 0;
	int i = 2;
	while (i < strlen(sub))
	{
		if (sub[i - 1] == sub[k])
		{
			next[i] = k + 1;
			i++;
			k++;
		}
		else if(sub[0]==sub[i-1])
		{
			sub[i]=1;
			i++;
			k++;
		}
		else if (sub[0] != sub[i - 1])
		{
			sub[i] = 0;
			i++;
			k++;
		}
	}
}

总结

        算法太难了!大家一定要好好学习呜呜呜辛苦各位小伙伴们动动小手,三连走一波 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤小满

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值