KMP算法学习笔记
总算把这个东西搞懂了......
KMP是一个求解字符串匹配问题的算法。
这个东西的核心是一个
这里的前缀和后缀概念略有不同,如 DUCK
的前缀为 D
,DU
,DUC
,后缀为 K
,CK
,UCK
,不包含 DUCK
本身。
再举一个例子,假设有字符串 DUCKDUCK
,则相同的前缀和后缀的最大为 DUCK
,因此
那么怎么求解呢?
对于
如果不是怎么办?我们设
那么,我们考虑新的这个前缀后面等不等于
可以手动模拟理解一下。
nxt[0]=-1; for(int i=1;i<m;i++) { t=nxt[i-1]; while(t!=-1&&s2[t+1]!=s2[i])t=nxt[t];//前缀不合法,继续找前缀 if(s2[t+1]==s2[i])nxt[i]=t+1;//终于配上了一个前缀 else nxt[i]=-1;//啥也配不上 }
有了这个
时间复杂度是
int i=0,j=0; while(i<n) { if(s[i]==s2[j]) { i++,j++; if(j==m) { cout<<i-m+1<<endl; j=nxt[j-1]+1; } } else { if(j==0)i++; else j=nxt[j-1]+1; } }
如果觉得不错的话,就给一个赞吧!
作者是 DengDuck ,转载请注明出处
文章链接: https://www.cnblogs.com/dengduck/p/17353468.html
感谢您阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步