自己也写了一下模板,加深一下印象吧。
next数组求法:
void next()
{
int i=0,j=-1;
dp[0]=-1;
while(i<p.size()-1)
{
if(j==-1''p[i]==p[j])
{
i++;j++;
if(p[i]!=p[j])
dp[i]=j;
else
dp[i]=dp[j];
}
else
{
j=dp[j];
}
}
for(i=0;i<p.size();i++)
{
cout<<dp[i]<<endl;
}
}
KMP主函数:
int look()
{
int i=0,j=0;
int x=q.size(),y=p.size();
while(i<x&&j<y)
{
if(j==-1''q[i]==p[j])
{
i++;j++;
}
else
{
j=dp[j];
}
}
if(j>=p.size())return i-j;
else return -1;
}
完整代码:
#include<iostream>
#include<string>
using namespace std;
string q,p;
int dp[1001];
void next()
{
int i=0,j=-1;
dp[0]=-1;
while(i<p.size()-1)
{
if(j==-1''p[i]==p[j])
{
i++;j++;
if(p[i]!=p[j])
dp[i]=j;
else
dp[i]=dp[j];
}
else
{
j=dp[j];
}
}
for(i=0;i<p.size();i++)
{
cout<<dp[i]<<endl;
}
}
int look()
{
int i=0,j=0;
int x=q.size(),y=p.size();
while(i<x&&j<y)
{
if(j==-1''q[i]==p[j])
{
i++;j++;
}
else
{
j=dp[j];
}
}
if(j>=p.size())return true;
else return false;
}
int main()
{
cin>>q>>p;
next();
if(look())cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}