KMP算法,next数组疑难点

KMP算法

如何理解next数组求解过程,如何理解配对中找出错位前一位?

KMP算法用于解决字符串匹配问题

可以用该题练习 Leetcode 28. 实现 strStr()
以下主要解释求解next数组和利用next数组配对的过程中比较难懂的地方,建议了解过kmp算法再看

next数组有很多种形式,有些人将next数组右移一位,有些人将next数组-1,本文表示的next数组是原始的既没有右移也没有-1,至于为什么右移、-1本文不做解释,原理其实是一样的,没什么不同,看个人理解和习惯。

1.配对

举例:
样本串:aabaabac
模式串:aabac
next: 01010

为什么配对的时候,找到不匹配那一项的时候,需要找前一项的next数组值?

因为next数组代表的是相等前后缀,例如上面例子中样本串配对到下标4->a的时候模式串到下标4->c两者不相等,此时找c的前一位的next数组值,next数组值代表的含义是当前长度的字符串的最大前后缀长度,此时c前一位的next数组值代表的是aaba的最大前后缀长度为1,也就是从开头数一位和从末尾数一位的字符串是相同的,这样有什么含义呢?

因为样本串和模式串匹配出错的位数的前一位所代表的串肯定相同也就是aaba,相同的串又有为1的相等前后缀,样本串中可以拿后缀来当作新的前缀,模式串可以跳过前缀直接从前缀后开始匹配


如何理解样本串中可以拿后缀来当作新的前缀,模式串可以跳过前缀直接从前缀后开始匹配是关键

例如例子:

此时出错下标4前面的字符串aaba是样本串和模式串中相等的

样本串:aabaa,此时拿出错下标4的前面长度为1的字符串当作重新开始配对的前缀,也就是aabaa将这一位a当作新的样本串前缀,这一位前缀不需要再进行对比,直接从这一位的后一位下标4开始对比,也就是样本串aabaabac从下标4开始对比

而模式串中,aa

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值