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

一,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按照我们的算法 相当于前缀 一定会有的 所以直接跳过 这也是这个算法的天才之处。

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

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值