字符串匹配算法KMP算法

在这里插入图片描述
一种字符串匹配算法。
在这里插入图片描述
上这个字,没匹配上,于是我们直接把子串拉倒上这里就行了。
在这里插入图片描述
只要没匹配上我们就直接转移到最后一个需要匹配的那个位置,进行重新匹配。

在这里插入图片描述
注意看这个细节,虽然整个句子匹配失败了,但是
我的子句中,有跟子句开头部门一样的地方,而子句中第二次出现跟开头一样的部分这里恰好成功了。所以,我们的子句要调到恰好成功的位置上进行再次进行比较。

在这里插入图片描述
建立一个next表,用来回溯过去。
在这里插入图片描述
next表说白了就是当匹配失败了之后,该往哪里去跳转
子串的指针去跳转到哪里。

一定要明白,什么叫后缀?后缀一定是有后的,有最后一个字的叫后缀
什么叫前缀,有第一个字叫前缀
在这里插入图片描述
当"江"字匹配失败之后
他的前缀字符串是 望江楼上望
望江楼上望 最长相同前后缀 就是江子,长度是1.

在这里插入图片描述

同理这个江匹配失败的话,前面的长串中,最长相等的前后缀是望江
所以长度是2,所以子串回溯到2那个位置去,因为望江两个字都判断成功了。

kmp算法的本质就是,长串一直走,子串跟着走,长串判断失败时候子串就回溯了,回到自己该去的位接着去走。

在这里插入图片描述
这个算法差一点的问题是
长串和短串一开始就没匹配到一起就,那长串不动
短串又调到0这个位置,相当于长短串是万万没变化
而且再进循环时候,还是这个问题,长短串没变化。

在这里插入图片描述
大神算法,倘若当前子串在0的位置,没匹配上的话,会调到一个特殊位置,就是索引变成-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值