为什么KMP算法的主串指针不用回退?

每个人的学习方法各不相同,有这么一小撮人,他们不习惯直接吸收书本或者教程中的正确结论,喜欢“钻牛角尖”,总是试图找各种方法先验证这些结论是否正确,然后再说服自己接受它们。

举个简单的例子,对于 "1+1=2" 这个等式,很多人在第一次接触它时都是死记硬背的,但有一些人会纠结“1+1 为什么等于 2”这个问题,甚至可能想尽各种方法去验证它。

我个人认为,这种学习方法“弊大于利”。最大的好处就是每个知识点都会学的非常透彻,不容易遗忘;但弊端有很多,学习新知识的过程会非常痛苦,学习进度也会非常慢,尤其对于初学者而言,钻牛角尖式的学习方式很容易半途而废。

我一直负责数据结构的答疑工作,有一个学员问了一个问题:为什么 KMP 算法中的主串指针不用回退,万一指针前面存在一个子串与模式串相同,不就漏掉了吗?当时我的回答是:“不好意思,这个问题没有系统思考过,KMP 算法已经非常成熟了,不会存在这样的 BUG 的,放心使用哈”。

不得不说,答疑数据结构是一个有挑战性的工作。事后我仔细研究了这个问题,也试图从各种教程中寻找答案,但它们都只是提到了“主串指针不需要回退”,没有给出具体原因。经过一段时间的思考,我逐渐意识到自己被学员带偏了,“主串指针不回退”是 KMP 算法的一大“特色”,记住就可以了,为什么要钻牛角尖呢?

当然,有一些读者确实是存在这个疑问的,如果直接让你们记住正确结论,肯定不会服气。接下来,我就将自己对这个问题的验证过程解释给大家,如果你不喜欢“钻牛角尖”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法教程(C语言版)

创作不易,多多支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值