在暴力匹配中,每趟匹配失败都是模式串后移一位再从头开始比较。而某趟已匹配相等的字符序列是模式的某个前缀,这种频繁的重复比较相当于模式串不断地进行自我比较,这就是其低效的根源。因此可以从分析模式串本身动手,如果以匹配相等的前缀序列中有某个后缀正好是模式串的前缀,那么就可以将模式串向后滑动到与这些相等字符对齐的位置,主串指针i无须回溯,并从该位置开始继续比较。模式串向后滑动仅与模式串本身相关,与主串无关。
next[j]数组的含义是:在子串的第j个字符与主串发生失配时,则跳到字串的next[j]位置重新与主串当前位置进行比较。
假设此时应于模式中第k个字符继续比较,则模式中前k-1个字符的子串必须满足以下条件:
,即前缀=后缀时。
若存在满足如上条件的子串,则发生失配时,仅需将模式向右滑动至模式串中k个字符和第i个字符相等。
next[1]==0;next[2]==1。