扩展KMP(exkmp)

扩展KMP算法用于求解主串S的所有后缀与模式串T的最长公共前缀长度,包含KMP算法的功能。算法通过递推方式计算extend和net数组,其中extend[i]表示S的后缀Ssuf(i)与T的最长公共前缀长度,net[i]表示T的后缀Tsuf(i)与T本身的最长公共前缀长度。算法根据不同情况分为Case1和Case2,分别计算extend[k]的值。net数组可以通过类似方法求解,先暴力计算net[1],然后利用已知的extend和net数组信息进行递推。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扩展KMP

exkmpexkmpexkmp 求解的问题:对于给定的主串 SSS ,和模式串 TTT ,求出主串 SSS 的所有后缀与模式串 TTT 的最长公共前缀长度

KMPKMPKMP 求解的问题是在主串 SSS 中模式串T出现的次数和位置,扩展KMP扩展KMPKMP 求解问题包含了 KMPKMPKMP 求解的问题,因为主串 SSS 中与模式串 TTT 的最长公共前缀长度等于 ∣T∣|T|T 的后缀就是 KMPKMPKMP 所求。


exkmpexkmpexkmp 算法求解过程实际是求两个数组的值:

net[i]net[i]net[i] : 模式串 TTT 的后缀 Tsuf(i)Tsuf(i)Tsuf(i) 与模式串 TTT 本身的最长公共前缀长度 (net指next,C++11中next为保留字)

extend[i]extend[i]extend[i]:主串 SSS 的后缀 Ssuf(i)Ssuf(i)Ssuf(i) 与模式串 TTT 的最长公共前缀长度


exkmp算法采用 递推求解extend[i]extend[i]extend[i] 的值可以由 extend[0..i]extend[0..i]extend[0..i]netnetnet 数组的值求得

算法推导:

设:主串 SSS ,长度 NNN ,模式串 TTT ,长度 MMM ,下标均从 000 开始。
假设 extend[0..i]extend[0..i]extend[0..i]netnetnet 数组已知,现在正在求解 extend[k]extend[k]extend[k] 的值

设最远匹配位置为 ppp (即主串 SSS 下标分别从 000 ~ K+1K+1K+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值