408数据结构——KMP算法解题思路

算法思想

KMP算法,在子串(模式串)与主串的匹配过程中,可谓是淋漓尽致地体现了“能跳则跳,跳的越远越好”的思想,因为跳过的位数越多,节省的时间就越多。整个算法唯一要解决的问题,就是当字符在匹配过程中失配的时候,我们最多可以一次性跳过多少位不比较,而且不会错过正确的匹配机会。掌握这一关键的思想,解题时就会清晰很多。至于详细的算法流程,详细的教程已经很多了,下面我主要分享一下个人在写KMP的408题目时总结的的一些思路和方法。

解题思路

关键点

不管是什么样的KMP题目,肯定是逃不了要模拟算法流程的。就像上面所说,其实只要我们拿到了子串和主串,知道按照什么规则,在正确的前提下,能够在每一次失配时跳过最远,那么算法自然就跑通了。至于题目问的一些问题,比如某一次匹配开始时主串和子串指针位置,或者匹配成功时单字符的比较次数,这些就很容易看出来。

一步求解next数组

教材中next数组的推理过程分成了三步,总结成一步操作如下:

next[i] = 子串前i-1个字符序列最长相等前后缀长度+1

有了next数组后,该怎么用它来执行跳位呢?

如果在第k处匹配失败:找next[k]=n,如果n≠0,将子串指针指向第n(n从1计&

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值