KMP算法

代码

  1. 获得部分匹配值表
    在这里插入图片描述
    在这里插入图片描述

next[j-1]详解

在这里插入图片描述

  1. i=8 与 j=5对应字母不同,即这串字母的第3到第8个与第0个到第5个不同,但是第3到第7个与第0到第4个相同
  2. 此时,要寻找的是第3到第7个这串数字中是否存在前后缀,如第3个和第7个相等,这样就可以直接验证第4个和第8个是否相等
  3. 因为第3到第7跟第0到第4相同,所以等同于验证第0到第4
  4. 此时j-1回到第4个数字,发现数组记录值(next(j-1))为2,即当前第3到第4跟第0到第1相等
  5. 等价于第6到第7个跟第0到第1个相等
  6. 所以此时验证第8个是否等于第2个
    (逻辑上第3个,但是数组下标是2,数组记录的是之前相同的个数,所以下一个的下标值会刚好等于相同的个数,即j(下标值) =next(j-1)(相同个数))
  7. 很遗憾第8个不等于第2个,即0,1,2不会等于6,7,8,需要重复上述1到6点
  8. 可归结为在第0个和1个中寻找是否有后缀(此时j=2->j=next(j-1)=1)
  9. 发现有,即此时第7个会等于第0个(后缀的后缀等于前缀的前缀)
  10. 验证第1个是否等于第8个,答案是相等,此时j++,数组填入2

A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值