一,KMP算法
KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
二,画图帮助大家理解
例如我们被匹配的字符串为str=abxabcabcaby,匹配的字符串为str1=abcaby;
我们先从匹配的字符创建一个匹配数组.
第一步 令i=0则指向str1的字符a,j=1指向str1字符b,由于a!=b,则标为0.
第二步i不变,j++,a!=c,则C标为0.
第三步i不变,j++,a==a,所以a下标标为1.
第四步i++,j++,b==b,所以b下标标为2.
第五步i++,j++,但c!=y,所以下标标为0.
a | b | c | a | b | y |
0 | 0 | 0 | 1 | 2 | 0 |
最后我们得到了这个表(很重要 依据匹配串构造成上表 就已经成功一半了)
接下来我们匹配两个字符串
str =abxabcabcaby。
str1=abcaby。
上图我们可以看出c!=x,但是我们不会在被匹配字符串中进行回溯,这时我们看表,在匹配字符串退回一步得b,所对应的下标为0,所以指针回到匹配字符串的初始位置也就是a.如下图
再从上图开始两个指针同时往后走
可以看出是在y的地方出现了问题,我们退回去一步看b的下标为2,所以我们下一次就从匹配字符串 abcaby的第二个位置也就是c开始。如下图,因为前面ab按照我们的算法 相当于前缀 一定会有的 所以直接跳过 这也是这个算法的天才之处。
接下来再一起往后走,所以可知匹配成功。