题目大意:
给出 A A 串和 B B 串,求 B B 串在 A A 串中出现的位置。
思路:
KMP K M P 算法模板题。
KMP K M P 这个算法一开始真的很难懂,但是接触后过一会再研究就会豁然开朗。这个东西也很难解释原理,只有自己搞懂。
推荐的 KMP K M P 讲解:https://blog.csdn.net/starstar1992/article/details/54913261/
时间复杂度 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;
}