为了便于理解,这里举一个具体的例子,我们分别使用 i,j 两个指针来表示当前匹配
的位置。首先 i=4,j=4 时,匹配失败,这时我们已经知道主串的 1~3 位分别为‘aba’,我们
就不需要重新回到 i=2,j=1 的来比较,因为此时我们已经可以确定 i=2 不可能匹配成功,
所以我们将 i 指针滑到 i=3 重新开始。而当 i=5,j=1 开始匹配时,我们发现匹配到 i=9,j=5
时失败了,这样我们就知道了主串的 5~8 位为‘abab’,所以我们将指针 i 滑到 i=7 开始匹配,
最终匹配成功。
KMP 算法的基本思想是:在遇到未能完全匹配的时候,充分利用当前得到的已知信息,
使得下一步匹配测试可以跳过尽可能多的肯定不可能匹配成功的字符,减少多余的测试和
比较,从而达到加快模式匹配过程的目的。
事 实 上 , 当 我 们 一 次 匹 配 失 败 后 , 我 们 得 到 了 一 个 p(1<=p<m) , 使 得
S1[i+1...i+p]=S2[1…p],且 S1[i+p+1]≠S2[p+1]。而我们希望完成的滑动,就相当于要找到
一个最小的数 i’(i+1<=i’<=i+p),使得 S1[i’+1...i’+q]=S2[1…q],这里 q=i+p-i’。