KMP算法中next数组前后缀证明

          先来一个主串:cabadabcdabbb

再来俩个“模式串”:1.abcc       2.abbb

对于1号模式串,让它跟主串进行匹配

 

       我们可以发现,前两个字符与主串首次相匹配时(也就是当i与j所指向的字符不匹配时),可以说明主串前面的都不跟1号模式串中的前两个字符匹配。

        那现在,我们再将2号模式串与主串进行匹配,这时候我们观察到1号跟2号模式串前两个字符是一样的,既然1号模式串与主串在匹配时,前两个字符首次出现相匹配的地方上图中 i 的前面,那我们将2号模式串与主串进行匹配的时候,是不是就可以直接将2号模式串之间移动到那里呢?这样就跳过了前两字符的匹配,直接开始第三个字符的匹配。同时我们就可以省下了前面一些明知匹配不会成功(因为前两字符首次匹配成功的位置在那里)的过程呢?

        现在我们知道了有这种办法来减少一些不必要的过程,那么现在,我们在来将1号跟2号模式串组合在一起(即abcdabbb)称为3号模式串,再来将3号模式串跟主串进行匹配,我们先不管前面的(就是假设前面的匹配都成功),就看第二个“ab”,当第二个ab与主串中的第二个ab相匹配时

 

 然后发现其后面的字符(i和j所指向的字符)不匹配了,正常操作应该是将模式串整体向后移一位,再从模式串的开头进行下一次的开始匹配。可我们可以通过上面刚刚发现的方法,来节省不必要的步骤:我们可以将模式串开头直接移动到(如下图):

 

然后从第三个开始进行匹配,这样子,我们就省下了不必要花费的时间。

对于模式串:abcdabbb

我们把前面和后面一模一样的字符串分别称为前缀后缀

当然我们在用这种办法解决问题时,需要考虑几点:

        1.我们在用这个办法的前提是:要确保前缀的开头是第一个模式串中的第一个字符,很显然,如果不是从第一个开始的话,那当我们跳的时候是不能确保模式串的第一个字符和主串是否匹配的。

        2.当模式串的某个字符与主串不匹配时,那我们就要去寻找该字符前面的所有字符中有两个一模一样子串,从而来找到正确的跳跃的的位置时候是不能确保模式串的第一个字符和主串是否匹配的。

        3.在跳跃到正确的位置后,我们要开始匹配的位置与前后缀之间的关系,在能保证下一步的正常进行

想要知道具体如何以写出简单易懂的求解next数组的代码,或者想更容易理解网上的next数组源码,请点链接KMP算法中关于next数组代码小白式解析-CSDN博客进行阅读。

如有错误,还请大佬斧正,谢谢!

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值