KMP算法

KMP算法难点在于对于回溯的理解,回溯是字串与主串的存在不匹配时需要找到当前比较值之前字符串的最大公共前后缀,把字串前缀移动到后缀位置。在进行与当前值的比较,(这里对于最大公共前后缀的理解我理解错了,想半天弄不明白,为什么这种方法可以快速进行匹配。前后缀只能从头开始,不是说在字串中的部分连续并且有重复出现的字符串。理解了这个就能理解为什么要进行回溯匹配,前后缀相等,当前的部分字串与主串匹配因此,前缀后移可以保证前缀与主串匹配,并且改变字串原先不匹配的值在与主串中当前值进行重新匹配。)

next[j] = k;j代表当前值,k代表回溯位置。next数组里面的索引和值,代表了子串中当任何一个索引不匹配时需要回溯的位置。有了next数字提供的不匹配值对应的回溯位置。KMP算法完整思路就有了。

主串和字串相互各个位置相互匹配遇到不匹配的位置就使用next数组求出回溯位置再进行匹配,直到主串或者子串匹配位置超出索引(如果子串匹配未超出索引,主串超出索引代表主串中无子串,匹配失败。反之,子串超出索引匹配成功返回索引。),用子串最后匹配的位置值减去子串长度得到子串开始位置对应再主串中的索引并返回。

刚刚学习KMP不对的地方请大家指正,共同进步,感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值