一、如何求
基本思想:
第一种情况:下标从1开始:
第二种情况:下标从0开始:
上述next[i]对应的值-1
常见例题:
1、已知字符串S 为“abaabaabacacaabaabcc”,模式串 t 为“abaabc”。采用 KMP 算法进行匹配,第一 次出现“失配”(s[i]≠t[j]) 时,i=j=5,则下次开始匹配时,i 和 j 的值分别是 () 。
结题思路:即是求next [next[5] ]对应的值,由上图可知失配情况就是需要在next[5] 外面在嵌套上一层next,那么就是next [next[5] ],需要注意的是这里模式串abaabc的下标是从“0”开始的,故
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
模式串 | a | b | a | a | b | c |
next | -1 | 0 | 0 | 1 | 1 | 2 |
而当发生失配时,i不变,求j就是求next [next[5] ],明显是2
nextval | -1 | 0 | -1 | 1 | 0 | 2 |
总结:关键是背住上面的图!
记忆技巧:
next: 判断 P[i-1] ?= P[next...[i-1]]
nextval: 判断 P[i] ?= P[next[i]]
二、怎么用
上面就是一个字串,下面的一行就是我们给出的next数组,用法也很简单,譬如说我们子串的第七个元素a与主串对应的元素进相比较失败了,由这一点可以说明,子串前面的六个元素都与主串匹配成功了,我们下一步就依照next数组的指示,用子串的第四个元素来与主串当中刚才没有匹配成功的那个元素比较,这样选择的依据是,我们把第四个元素与主串中刚才失败的那个元素对齐后,子串的第四个元素前面的元素都是匹配的。