KMP算法

KMP算法

KMP算法是有三位计算机科学家 D.E.Knuth、J.H.Morris、V.R.Pratt提出,取自三人姓氏首字母。

KMP算法是String Search算法,之前搜索String,可以用BF,或者BM。

BF

暴力算法,对主串和模式串进行逐个比较。第一轮时,先对第一个字符进行比较,如果不合适就将模式串右移一位,然后继续比较;依次类推,直到合适匹配或者不符合为止。这样比较由于每次都要重头比较,效率太低。

BM

模式串的比较是从右到左,模式串的移动是从左到右,借用坏字符规则和好后缀规则,在每一轮比较时,可以让模式串尽可能的多移动几位。

KMP算法

和BM很相似,也是为了让模式串在每一轮多移动几位。

首先先明白字符串的前缀和后缀。比如一个string,{ababac},前缀集合就是{a,ab,aba,abab,ababa},后缀集合就是{babac,abac,bac,ca,a},那么交集就是{a},就是公共子串。

假设主串{ABABABAC},模式串{ABABAC},那么先找到公共子串{ABA},在主串和模式串中可以分别称为最长可匹配后缀子串和最长可匹配前缀子串

在这里插入图片描述

当C与B不匹配的时候,就根据获得的公共子串的长度,进行移动,找模式串中的长度+1位置的元素,和主串进行比较。比如例子中是3,就右移至和最长可匹配后缀子串相匹配,找第四位与主串相对的位置比较。

在这里插入图片描述

由此可以生成next数组,来缓存记录找到的最长可匹配后缀子串和最长可匹配前缀子串。

在这里插入图片描述

有些地方的index开始位置不一样,这里借鉴b站视频,网上有很多写KPM的文章,读了很多后还是阮一峰大神的比较清楚。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值