题目大意:
给出AA串和BB串,求BB串在AA串中出现的位置。
思路:
KMPKMP算法模板题。
KMPKMP这个算法一开始真的很难懂,但是接触后过一会再研究就会豁然开朗。这个东西也很难解释原理,只有自己搞懂。
推荐的KMPKMP讲解:javascript:void(0)
时间复杂度O(n)O(n),暴力时间复杂度O(n×m)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;
}