KMP的一些理解

  • KMP这个东西一直是看了忘忘了看。今天又看了一遍,记一下,以后忘了的话能想得快一点。
  • KMP和朴素的字符串匹配不同点在于:传统的字符串匹配主串和模式串在匹配失败的时候都需要回退(主串退到开始匹配位的后一位,模式串退到自己的开头),时间复杂度O(m*n);而KMP的主串是始终不会退的,它利用了当前匹配失败字符之前的子字符串信息,用了一个next数组保存这个信息。

  • 这里利用的信息是已匹配字符子串的最长的相同的前缀和后缀。e.g.
    主串: abbaabbaaba
    模式串: abbaaba
    模式串匹配到最后一位的时候匹配失败,这时候就要看之前匹配过得abbaab最长的相同的前缀和后缀。abbaab前缀有a, ab, abb, abba, abbaa(不包含最后一个字符);后缀有b, ab, aab, baab, bbaab(不包含第一个字符)。最长匹配是ab,那模式串就回退到第3个字符继续匹配。

  • 那么为什么可以这样做呢?这个做法其实相当于模式串用自己的头部去匹配自己的尾部,因为当不匹配发生时,前面匹配的一小段对于两者是相同的,假设我们不用next数组回退,是不是也要一步一步那模式串去跟之前比过得那些字符比较呢?所以这里next数组的操作是合理合法的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值