KMP算法
KMP算法
KMP算法是一个字符串算法,通常用于匹配字符串。
KMP算法的原理
如果我们暴力枚举下标 \(i,j\),\(i\) 是文本串的下标,\(j\) 是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度 \(O(NM)\),其中 \(N,M\) 分别为文本串和模式串的长度。
我们看一下匹配过程:(gif 动图请耐心观看)
时间复杂度高吧,出题人随便就 \(hack\) 掉了。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
文本串 | x | y | x | y | x | y | x | y | x | w |
模式串 | x | y | x | y | x | y | w | y |
咦?我们会发现 \(文本串.substr(3,4)=模式串.substr(1,4)=模式串.substr(3,4)="xyxy"\),这样我们 \(i=7,j=7\) 匹配失败时可以跳 \(2\) 次(\(j=3\)),就可以达到正确性和时间复杂度平衡的效果。
我们维护 \(nxt_i\) 表示s和s以i结尾的最长公共前后缀的长度,这样我们在 \(文本串_i,模式串_j\) 匹配失败时 \(j\) 可以直接跳到 \(nxt_j\)。
维护 nxt[i]
若 \(s_i==s_j\) 也就是 \(模式串_i,模式串_j\) 匹配时,nxt[++i]=++j
(其他同理写法也可以,最好固定一个写法),否则按文本串和模式串匹配失败来。
代码
nxt 数组的性质
nxt[i]
既表示以i结尾的最长公共前后缀的长度,又表示 \(i\) 失配时跳跃的位置;nxt[i]
越大,匹配的速度越慢,但至少移动 \(1\) 步;- 对于字符串 \(s\),
nxt[]
的最大下标s.size()
;
KMP算法应用
P3375 【模板】KMP
P4391 [BOI2009] Radio Transmission 无线传输
给你一个字符串 \(s_1\),它是由某个字符串 \(s_2\) 不断自我连接形成的(保证至少重复 \(2\) 次)。但是字符串 \(s_2\) 是不确定的,现在只想知道它的最短长度是多少。
不想说过程,直接说结论:ans = n - nxt[n]
CF1200E Compress Words
CF126B Password
- 目标子串 \(t\) 一定是 \(s\) 的公共前后缀;
- 求出
nxt[]
数组,并截取最长公共前后缀 \(tmp\); - 在 \(s[1, len-2]\) 范围内跑KMP,若找到 \(tmp\),则 \(tmp\)就是答案;
- 若
nxt[nxt[n]] != -1
,则 \(s[0,nxt[nxt[n]]\) 即为答案;
P3435 [POI2006] OKR-Periods of Words
- 根据画图推导,对于 \(s\) 的每一个前缀 \(t\),要找 \(t\) 的最短公共前后缀;
P4824 [USACO15FEB] Censoring S
- 删除 \(t\) 串之后产生的新的 \(t\) 串的起点一定在删除位置的左侧;
- 后出现 \(t\) 串先处理,考虑用栈维护;
- 栈中存储的下标维护已经匹配的 \(t\) 串的位数,
match[i]
;
P4591 [TJOI2018] 碱基序列
截止 \(2024\) 年 \(7\) 月 \(16\) 日,此题难度 \(\color{#9d3dcf} 省选/NOI−\)。
- 定义 \(dp_{i,j}\) 表示前 \(i\) 个氨基酸可能的碱基序列以 \(s_j\) 结尾的可能的方案数;
- 答案为:\(\sum^{s.size()-1}_ {i=0}dp_{n,i}\);
- 状态转移方程:
dp[i][j+t.size()-1]=dp[i-1][j-1]
(这里我写的是哈希的); - 初始状态:
dp[0][i]=1
。
__EOF__

本文链接:https://www.cnblogs.com/wbw121124/p/18306182.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效