KMP算法失配处理

已知字符串s为“abaabaabacacaabaabcc”,模式串T为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时i和j的值分别是(       )

A.i=1,j=0

B.i=5,j=0

C.i=5,j=2

D.i=6,j=2

解这道题前,首先要了解什么是KMP算法?

  1. KMP算法是三位学者提出来的,全称是克努特D.E.Knuth—莫里斯J.H.Morris—普拉特V.R.Pratt操作,是一种根据BF算法改进的字符串的模式匹配算法。
    1. 模式匹配就是在主串中寻找一个给定的模式,返回主串和模式串匹配的第一个子串的首字符位置。通常主串比较大,而模式串则比较短小。
  2. 所以如果要了解什么是KMP算法,需要先了解什么是BF算法。
    1. BF算法(Brute Force算法)
      1. 也就是我们经常说的暴力算法。
      2. 基本思想:
        1. 就是将主串S的第一个字符与模式串T的第一个字符字符字符进行匹配,
          1. 若相等,则继续比较S的第二个字符和T的第二个字符;
          2. 若不相等,则比较S的第二个字符和T的第一个字符;
          3. 依次比较下去,直到得出最后的匹配结果。
        2. 【换句话就是在模式串中有多个字符和主串中的若干个连续字符比较都相等,但最后一个字符比较不相等时,主串的比较位置需要回退
    2. 而KMP算法在上述情况下,通过一个本身包含了模式串的局部匹配信息的next()函数,利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,即主串位置不需要回退【或者理解为求得模式的特征向量之后,在每次匹配过程中发生某次失配时,不再单纯地把模式后移一位,而是根据当前字符的特征数来决定模式右移的位数(右移的距离是由模式串T本身决定的,即T的子串t[0...j-1]中的前缀串和后缀串相等的最长长度)】,这样就可以大大提高效率,这就是KMP算法。

回到题目:

已知字符串s为“abaabaabacacaabaabcc”,模式串T为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时i和j的值分别是(       )

A.i=1,j=0

B.i=5,j=0

C.i=5,j=2

D.i=6,j=2

根据上面讲到的知识:

KMP算法在发生某次失配(s[i]≠t[j])时,i会保持不变,而对于j,

KMP算法由于不再单纯地把模式后移一位,而是根据当前字符的特征数来决定模式右移的位数(右移的距离是由模式串T本身决定的,即T的子串t[0...j-1]中的前缀串和后缀串相等的最长长度),故j会根据上面的方法回退到next的位置并重新比较

本题中讲到字符串s为“abaabaabacacaabaabcc”,模式串T为“abaabc”,

又因为模式串T的子串称为子串t,

第一次失配时i=5,则子串t为“abaab”,

序号0123456

主串s

“abaabaabacacaabaabcc”

abaaba...
【此处模式串T主串s发生失配】

模式串T

“abaabc”

abaabc
子串tabaab

故在这个子串t里面即“abaab”这5个字符中相等且最长的前后缀为“ab”,即“abaab”,

即T的子串t[0...j-1]中的前缀串和后缀串相等的最长长度j=2,代表右移了2位,

故下次开始匹配时i不变为5,j为2,

故选C。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZYT_庄彦涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值