KMP优化
KMP算法是有优化版本的,之前写过文章简单的讨论了基本的KMP算法思想,但是对于一些含有连续重复字符的字符串,会出现多次冗余的比较。
例如:字符串S=“aaababa”和模式串P=“aaac”比较时,会出现多次的不必要的比较,这个我会在下面细说。
Next数组重定义
我们首先要解决的问题就是next数组的意义,之前的我写的KMP文章里面,next数组的意义是:字符串真子串中既是前缀串同时又是后缀串中最长的那个子串的长度。例如还是模式串P=“aaac”,其对应的next数组值为:
子串 | a | aa | aaa | aaac |
---|---|---|---|---|
next[] | 0 | 1 | 2 | 0 |
为了优化KMP,我们要换一种写KMP代码的思路,参考网上的代码及next数组的定义,我们首先就是需要重新改变一下next数组,我们现在定义next[i]为:表示匹配串在i处如果匹配失败下次移到的位置。 如果第一个字符就匹配不成功,那么没有地方移动,我们就定义next[0] =-1.
于是模式串P=“aaac”对应新的next数组为:(不考虑优化)
子串 | a | aa | aaa | aaac |
---|---|---|---|---|
next[] | -1 | 0 | 1 | 2 |
相当于把之前的next数组整体向右移了1位,并在开始处加入-1,重新定了next数组之后,我们的KMP算法该怎么写呢?如下: