【模板】KMP字符串匹配【KMP】

匿名 (未验证) 提交于 2019-12-03 00:43:02

给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。


思路:

KMP算法模板题。 
KMP这个算法一开始真的很难懂,但是接触后过一会再研究就会豁然开朗。这个东西也很难解释原理,只有自己搞懂。 
推荐的KMP讲解:https://blog.csdn.net/starstar1992/article/details/54913261/ 
时间复杂度O(n),暴力时间复杂度O(n×m)


#include <cstdio> #include <iostream> #include <cstring> using namespace std;  int next[1000101],n,m,j; char a[1000101],b[1000101];  int main() {     cin>>a+1;     cin>>b+1;     n=strlen(a+1);     m=strlen(b+1);     next[1]=0;     for (int i=1;i<m;i++)  //求next数组     {         while (b[i+1]!=b[j+1]&&j>0) j=next[j];  //不匹配         if (b[i+1]==b[j+1]) j++;  //匹配成功         next[i+1]=j;     }     j=0;     for (int i=0;i<n;i++)     {         while (a[i+1]!=b[j+1]&&j>0) j=next[j];  //不一样         if (a[i+1]==b[j+1]) j++;         if (j==m)  //找到         {             printf("%d\n",i-j+2);             j=next[j];         }     }     for (int i=1;i<=m;i++)      printf("%d ",next[i]);     return 0; }

 

原文:https://www.cnblogs.com/hello-tomorrow/p/9356733.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!