KMP算法

一、什么是KMP算法
KMP算法命名是由D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的,用于解决字符串匹配问题。
二、KMP算法关键内容
next数组
1、 求最长前后缀公共长度

公共前后缀:给定模式串为ABCDABD
模式串的各个子串 前缀 后缀 最大公共元素长度
A 0 0 0
AB A B 0
ABC A,AB C,BC 0
ABCD A,AB,ABC D,CD,BCD 0
ABCDA A,AB,ABC,ABCD A,DA,CDA,BCDA 1
ABCDAB A,AB,ABC,ABCD,ABCDA B,AB,DAB,CDAB,BCDAB 2
ABCDABD A,AB,ABC,ABCD,ABCDA,ABCDAB D,BD,ABD,DABD,CDABD,BCDABD 0

子串对应的最大公共元素长度表
模式串 A B C D A B D
前后缀最大公共前后缀长度 0 0 0 0 1 2 0

看失配的字符的上一个字符的最大长度值
next数组:最大公共元素长度表所有元素后移一位,然后第一个赋值为-1即可
下标 0 1 2 3 4 5 6
模式串 A B C D A B D
next数组 -1 0 0 0 0 1 2
失配时模式字符串向右移动的位数:失配字符所在的位置-失配字符对应的next值
模式串中存在相同前缀和后缀,p0,p1…pk-1 = pj-k,pj-k+1,…pj-1。
pj与si进行匹配,匹配失败后另pk跟si进行匹配,j就变成了k,模式串向右移动了j-next[j]位(next[j]=k)
next[j]表示j处字符失配后,下一次匹配模式串应该跳到的位置
时间复杂度:O(m+n)
j = -1 或当前字符匹配成功 s[i] == p[j] i++,j++ 继续匹配
j!=-1 且当前字符匹配失败 s[i]!=p[j],i不变,j=next[j]
模式串P相对于文本串S向右移动了j-next[j]位

例子:
S:BBC ABCDAB ABCDABCDABDE
P:ABCDABD
S[i]!=P[j] 失配字符A的next[0]=-1
模式串移动位数 0-(-1)=1 即模式串向右移动1位
以此类推。

文章参考:https://eveture.blog.csdn.net/article/details/101543247

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值