首页 > 试题广场 >

则下次开始匹配时,i 和 j 的值分别是 () 。

[单选题]

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

  • i=1,j=0
  • i=5,j=0
  • i=5,j=2
  • i=6,j=2
发表于 2019-02-19 22:46:52 回复(0)
更多回答
推荐

由题中“失配 s[i] t[j] 时, i=j=5 ,可知题中的主串和模式串的位序都是从 0 开始的(要注意灵活应变)。 按照 next 数组生成算法,对于 t 有:

编号

0

1

2

3

4

5

t

a

b

a

a

b

c

next

- 1

0

0

1

1

2

依据 KMP 算法“当失配时, i 不变, j 回退到 next[j] 的位置并重新比较”,当失配 s[i] t[j] 时, i=j=5 ,由上表不难得出 next[j]=next[5]=2 (位序从 0 开始)。从而最后结果应为: i=5 i 保持不变), j=2

编辑于 2016-12-01 18:36:56 回复(0)
字符串s 前几位为abaaba而模式串为abaabc,可知位序从0开始,求next数组时只要看模式串中的字母前面的next,为0就看该字母的前面串中前一个和后一个是否相等,相等加1,不等减一,最小为0。next为1就看前面串中的前两位和后两位是否相等,不等减一再看前一位和后一位,不等再减一,相等则加一。以此类推
发表于 2017-10-27 18:23:45 回复(0)
如果以上回答看不明白的朋友,或者KMP算法不明白的朋友可以参考一下这篇博客。http://blog.csdn.net/yutianzuijin/article/details/11954939/
发表于 2017-09-03 17:58:49 回复(0)
先计算模式串abaabc的next数组
abaabc
011223
当匹配到i=5时,a!=c,
abaabaabacacaabaabcc
abaabc
123456789
然后 next[5]=3,移动模式串t往后3个位置,
abaabaabacacaabaabcc
xxxabaabc
12345678
i=5,j=2,继续比较

编辑于 2016-11-24 15:05:35 回复(0)
我贴一个阮一峰大佬7年前的文章吧,将KMP算法讲的很清楚http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
发表于 2020-06-10 22:10:50 回复(0)

由题中“失配 s[i] ≠ t[j] 时, i=j=5 ” ,可知题中的主串和模式串的位序都是从 0 开始的(要注意灵活应变)。 按照 next 数组生成算法,对于 t 有:

编号

0

1

2

3

4

5

t

a

b

a

a

b

c

next

- 1

0

0

1

1

2

依据 KMP 算法“当失配时, i 不变, j 回退到 next[j] 的位置并重新比较”,当失配 s[i] ≠ t[j] 时,i=j=5 ,由上表不难得出 next[j]=next[5]=2 (位序从 0 开始)。从而最后结果应为: i=5 ( i 保持不变), j=2 。

发表于 2016-12-13 18:14:24 回复(0)
笔记:感谢牛友指引,终于清楚KMP算法了


解析:根据上面视频学习next数组和KMP算法序列的比较和移动可知:next数组为:


比较字符串和模式串:


编辑于 2021-03-31 14:08:42 回复(0)

分析:但凡有一点点对KMP思想的理解,就很容易排除A,D。因为文本串S在失配时指针不动。 
剩下BC,而B显然是不对的,因为,我们目的是在失配时让模式串中指针往右游走更多距离。因为比较时已经看到了挺多字符,不用起来做一个快速的决策,实在过于浪费。

因此,单纯解此题而言,不用真正用KMP去求解,用基本思想就足够了。

而如果是动手解,需要注意下标是从0开始的。即abaabc比较到c失配了,该在模式串中选择的是第三个字符(P[2])与文本串比较。此时i = 5,S[5] = a.恰好相等。我们再往前看S[5]之前的是ab, P[2]之前的也是ab,即前面都是匹配的。从这里出发再往后进行比较即可。

所以i = 5(没变),j=2(指示下一个模式串的下标),此时S[i] = P[j]。这正是失配时问题的解决方案。

发表于 2017-08-15 16:08:30 回复(0)
根据KMP算法中的next数组定义 next[j] = 3  就说明 需要 然模式串从 0 开始 移动三位  即  移动到 j = 2
发表于 2023-09-07 14:02:29 回复(0)
-1 a 0 ab 0 aba 1 abaa 1 abaab 2 c对应2
编辑于 2021-11-27 17:51:57 回复(0)
<p>如果。单单回溯的话 效率太低,所以 他就看前醉和后醉相同的位置 从前醉开始</p><p><br></p>
发表于 2020-06-29 18:44:34 回复(0)
c
根据kmp算法,i=fail[i-1]+1;   fail()为失败函数。
发表于 2020-02-08 15:33:29 回复(0)
c
next:-1 0 0 1 1 2
j=next[j] i=i
发表于 2019-11-14 21:29:45 回复(0)
KMP算法
a b a a b c
-1 0 0 1 1 2
给出这个规律的原因是 根据是否出现过 然后第几次出现作为判断
KMP算法的特点:失效i不变 j变为失效的顺序

编辑于 2018-10-06 09:10:11 回复(0)
依据 KMP 算法“当失配时, i 不变, j 回退到 next[j] 的位置并重新比较”,
发表于 2017-05-31 15:00:00 回复(0)