自周四之后这两天,没怎么系统的看,今天周六把作业,等等琐事处理完了,明天一天没有别的事,会系统的看看知识点。
今天把kmp算法看了一看,现在终于明白了:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char a[1007],b[1007];
int p[1007],n,m;
void pre()// 预处理相当于b串,从1到b的长度,找前缀等于后缀的最长长度。
{
p[1]=0;
int j=0;
for(int i=1;i<m;i++)
{
while(j>0&&b[j+1]!=b[i+1])j=p[j];
if(b[i+1]==b[j+1])j++;
p[i+1]=j;
}
}
/*int kmp()
{
int ans=0;
int j=0;
for(int i=0;i<n;i++)
{
while(j>0&&b[j+1]!=a[i+1])j=p[j];
if(b[j+1]==a[i+1])j++;
if(j==m)
{
ans++;
j=0;
}
}
return ans;
}*/
void kmp()
{
int j=0;
for(int i=0;i<n;i++)
{
while(j>0&&b[j+1]!=a[i+1])j=p[j];
if(b[j+1]==a[i+1])j++;
if(j==m)
{
cout<<i+1-m+1<<endl;
j=p[j];
}
}
}
int main()
{
while(cin>>a+1)
{
if(a[1]=='#')break;
cin>>b+1;
m=strlen(b+1);
n=strlen(a+1);
pre();
//cout<<kmp()<<endl;
kmp();
}
}
具体请看大佬写的:
https://blog.csdn.net/starstar1992/article/details/54913261/
如果你看不懂KMP算法,一定要看看这个视频!!!!!!!!!!!虽然讲的慢,但是很详细!!!!
上:http://v.youku.com/v_show/id_XODYxNjExODQ=.html 第 34分钟开始
下:http://www.56.com/u28/v_NjAwMzA0ODA.html