欢迎光临散文网 会员登陆 & 注册

C++ 算法竞赛进阶指南 kmp模式匹配算法

2023-03-11 20:02 作者:萧云纹  | 我要投稿

字符串

一、Kmp模式匹配

(1)问题描述

有两个分别叫做A和B的字符串,它们的长度分别为N,M。

求出A是否为B的子串,如果是,求出A在B中每次出现的位置(最后一位)

(2)算法描述

①def

我们定义一个next数组。形式化来说,next的第i位就是A的前缀子串和以第i位为结尾的非前缀子串可以相等的最长长度。(伪代码定义下图)

再定义一个j数组。形式化来说,j的第i位就是A的前缀子串和以第i位为结尾的B的子串可以相等的最长长度。(伪代码定义下图)

分别为next和j的定义


 

根据j的定义,我们可以知道当j数组的某一位的值为N时,A为B的子串且这次出现的最后一位为i。

②优化

显然,直接暴力next数组的复杂度并没有达到算法的要求。为了优化算法效率,我们需要进行优化。

首先,我们定义next的第i位的所有can为它的“候选项”。

引理一:next的第i位的所有can根据从大到小的排序方式,分别为j,next[j],next[next[j]],etc.、

//证明:当next数组的前j位和以i结尾的后j位相等时,next数组的前x位和以next[i]位结尾的x位相等,因为他们在next[i]的计算过程中重叠(形式化如下图)

 

以上是kmp的算法描述,下一篇中我将写一个kmp例题的题解。   


C++ 算法竞赛进阶指南 kmp模式匹配算法的评论 (共 条)

分享到微博请遵守国家法律