标签:老师 new https lap else blank 分享 文本 字符串匹配
KMP是一个困扰我很久的算法,听老师或者是学姐讲了差不多有4次了,但是还是搞不太懂,今天终于,终于,终于搞懂了!
——2017-10-29 Vanora
首先推荐一下KMP详解——July
读罢之后内心只有一个感觉:我的KMP终于可以毕业了qwq
学东西千万不要求快!细细地,慢慢地去读这篇文章,相信你也可以从头到尾彻底理解KMP算法呦~
真正意义上的KMP板子题,很良心
一定要真正理解nxt[]求得到底是什么,是用匹配串求解还是用文本串
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int M = 1000011; char s[M],p[M]; int lens,lenp; int nxt[M]; void getnxt() { int k=-1,j=0; nxt[0]=-1; while(j<lenp) { if(k==-1 || p[j]==p[k]) { j++;k++; nxt[j]=k; //记录更新的nxt值 } else k=nxt[k]; } } void KMP() { int i=0,j=0; while(i<lens) { if(j==-1 || s[i]==p[j]) i++,j++; //j==-1:没有nxt,所以从一开始进行匹配 //s[i]==p[j]:当前文本串与匹配串的位置上的字符匹配成功,继续匹配 else j=nxt[j]; //寻找更短的公共前后缀 if(j==lenp) { printf("%d\n",i-lenp+1); i--; //文本串之前已经匹配过了,所以没有再次进行匹配的需要了 j=0; //匹配串从新开始进行匹配 } } } int main() { cin>>s>>p; lens=strlen(s); lenp=strlen(p); getnxt(); KMP(); for(int i=1; i<=lenp; i++) printf("%d ",nxt[i]); return 0; }
标签:老师 new https lap else blank 分享 文本 字符串匹配
原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7750431.html