已知字符串S 为“abaabaabacacaabaabcc”,模式串 t 为“abaabc”。采用 KMP 算法进行匹配,第一 次出现“失配”(s[i]≠t[j]) 时,i=j=5,则下次开始匹配时,i 和 j 的值分别是 () 。
由题中“失配 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 。
分析:但凡有一点点对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]。这正是失配时问题的解决方案。
由题中“失配 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 。