KMP
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
https://www.acwing.com/solution/content/23907/
先上两个大佬的博客
能懂基本的思想了
第二个图来自acw的第二个题解
看到这里应该就能明白了
OK了,了解到这里就能去听y总的课了...
next[i]表示以i为终点的后缀与和从1开始的前缀相等且这个后缀的长度最长,其实也就是之前博客里又说的匹配表
把子串单独拎出来看
然后移动之后就又开始看看下一个点是否匹配了
好了,现在过程都懂了,开始写代码:
主要分为两个部分:
第一个部分:字符串的匹配
这个是acw下面的一个评论,本来刚开始还不是很理解,现在很理解了
//KMP的匹配过程 for(int i=1;j=0;i<=m;i++) { while(j&&s[i]!=p[j+1]) j=ne[j];//这是一个往后退的过程,找到一个类似于前缀的另一个与s串匹配的位置 if(s[i]==p[j+1]) j++;//如果退无可退之后还不满足条件,那就到i的下一个位置 if(j==n) { //完成匹配 } }
NND,终于懂了.....
刷了三天,知道是个啥意思了,hhh
#include<iostream> using namespace std; const int N=100010,M=1000010; char q[N],s[M]; int ne[N];//保存next数组 int main() { int n,m; cin>>n>>q+1>>m>>s+1;//下标均从1开始 for(int i=2,j=0;i<=n;i++) //j表示匹配成功的长度,i表示q数组中的下标,因为q数组的下标是从1开始的,只有1个时,一定为0,所以i从2开始 { while(j&&q[i]!=q[j+1]) j=ne[j]; //如果不行可以换到next数组 if(q[i]==q[j+1]) j++; //成功了就加1 ne[i]=j; //对应其下标 } //j表示匹配成功的长度,因为刚开始还未开始匹配,所以长度为0 for(int i=1,j=0;i<=m;i++) { while(j&&s[i]!=q[j+1]) j=ne[j]; //如果匹配不成功,则换到j对应的next数组中的值 if(s[i]==q[j+1]) j++;//到退无可退的时候,就进行下一个i //匹配成功了,那么j就加1,继续后面的匹配 if(j==n)//如果长度等于n了,说明已经完全匹配上去了 { printf("%d ",i-j); //因为题目中的下标从0开始,所以i-j不用+1; j=ne[j]; //为了观察其后续是否还能跟S数组后面的数配对成功 } } return 0; }
代码还有点小细节懂的不是很彻底,再刷刷吧...
********************************哈哈哈哈,新的一刷又来啦
之前开头的那个;链接仅仅了解一下专有名词就好,具体代码的实现和那个还是有一点点差别的
https://www.bilibili.com/video/BV1Qb411h7U6/
配上这个动画,再加上我下面的讲解简直一目了然,我吹的,看个人理解
其实整个KMP的过程,就是一直频繁移动子串也就是p串的一个过程,可是这个是代码啊,怎么可能真的实现移动
但是可以实现指针的移动,也就是刚刚上面所说的退的情况,恕我直言,那个说法对我来说挺不好理解的
现在换一个思路,比如ABCEABDE为s串,ABD为模板串,也就是p串,在C不匹配的时候,直接移动ABD到ABDE的那个位置与之对齐(但实际上就是指针重新恢复到刚开始的那个位置啦)
然后就是移动i的事情啦,因为s[i]==p[j+1]j才会++,如果不满足条件那就是i++,直到i指针i指针与移动之后的ABD第一个开始匹配(并不是移动的哦,只是指针又指到匹配的那个位置了)
这只是我自己的理解,觉得利于我的理解,一定要配上动画啊,不然有些干瘪,hhh
其实刚刚所说的就是这个图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具