KMP 学习笔记
KMP 学习笔记
高中的时候只是迷迷糊糊地理解了一点吧,停留在了背板的层面,后来甚至连板都背不利索了。
从现在的视角来看KMP,又有新的收获。
Intro
去理解一个算法一个比较好的方式其实是建立实际意义。
为什么打游戏的时候发不出藏话?试想一下,如果你在聊天框里面输入一个
解决
以下都记文本串为
暴力
有一个很 naive 的想法就是,暴力地去枚举文本串的每一个开头,然后尽可能多地与模式串(藏话串)向后匹配,这样的时间复杂度是
优化暴力
假设对于某个开头,已经匹配完了一定长度的串,但是在接下来的一个位置里面失配了,这里举个例子,比如
在这个例子中,我们实际上已经把
显然对于
可以观察到,这样其实是截取了 **模式串 **的一个前缀串
KMP
记对于一个前缀
枚举当前应该加入
int j=0; for(int i=1;i<=len1;++i) { while(j&&t[j+1]!=s[i])j=nex[j]; if(t[j+1]==s[i])j++; if(j==len2) cout<<i-j+1<<'\n'; }
更形式化的,
不难发现,其实这个
如果已经成功求出了
int j=0;nex[1]=0; for(int i=2;i<=len2;++i) { while(j&&t[j+1]!=t[i])j=nex[j]; if(t[j+1]==t[i])j++; nex[i]=j; }
图示
有一张比较抽象的解释
正确性 & 复杂度
正确性
为什么这样是不漏的?因为
复杂度
这个复杂度其实也不太好分析,但洛谷第一篇题解写的很有道理:
“每次位置指针
ExKMP(Z函数)
挖个坑寒假或者是之后来做这个板块,毕竟除了数据结构和字符串之外的基础内容也得学一学。
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18614468
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!