KMP的算法比起BF算法的效率有一定的提高,提高到o(m+n)。
此算法与BF算法不同的是i不需要回溯,j也不一定要从头开始。
i不回溯,则不用管。但j不一定需要从头开始,那么j应该回到哪个位置呢,我们用next[j]的数组来存放j的位置。
“从头开始的k-1个元素”是指其前缀,如有一个字符串“abcd”,那么“a”,“ab”,“abc”都为其前缀,而“abcd”不是。
“j前面的k-1个元素”是指后缀,如一个字符串“abcd”,那么“d”,“cd”,“bcd”都为其后缀,但不包括其本身。
看如下例子:
通常来说,第一个都为0(j=1),第二个都为1(前面只有一个元素,无前缀后缀,属于其他)
当j=3时,前缀a!=后缀b,则为其他情况,next=1;
当j=5时,前缀a==后缀a,但ab!=ca,则为2;
如此依次类推。
代码如下:
当遇到如下特殊情况时next函数可以进行改进:
因为字符都为a,都不能与b进行匹配,所以可以进行优化。
可以根据next求nextval,如:第三位a的next为1,则用第三位与第一位比较(next是多少就与第几位比较),相同为0,不同就为next的值