0
点赞
收藏
分享

微信扫一扫

如何理解KMP算法(简易版)

书坊尚 2022-03-24 阅读 37

一,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.

abcaby
000120

最后我们得到了这个表(很重要 依据匹配串构造成上表 就已经成功一半了)

接下来我们匹配两个字符串

str  =abxabcabcaby。

str1=abcaby。

 

上图我们可以看出c!=x,但是我们不会在被匹配字符串中进行回溯,这时我们看表,在匹配字符串退回一步得b,所对应的下标为0,所以指针回到匹配字符串的初始位置也就是a.如下图

再从上图开始两个指针同时往后走

可以看出是在y的地方出现了问题,我们退回去一步看b的下标为2,所以我们下一次就从匹配字符串 abcaby的第二个位置也就是c开始。如下图,因为前面ab按照我们的算法 相当于前缀 一定会有的 所以直接跳过 这也是这个算法的天才之处。

接下来再一起往后走,所以可知匹配成功。

 

 

 

 

举报

相关推荐

0 条评论