#include<iostream>
#include<cstring>
#define N 100
using namespace std;
//最小循环节的长度 L=len-next[len];
//如果len%(len-next[len)==0,循环周期T=len/L;
//需要补充的元素个数成为循环 L-next[len]%L;
//next[i] 表示前面长度为i的字串中,前缀和后缀相等的最大长度
string S,T;
int next[N];
void KMP()
{
int i=0;
int j=-1;
int len_S=S.length();
int len_T=T.length();
while(i<len_S)
{
if(-1==j||S[i]==T[j])
{
i++;
j++;
}
else
{
j=next[j];
}
if(j==len_T)
{
//匹配成功
}
}
}
void getNext()
{
int i=0;
int j=-1;
next[0]=-1;
int len = T.length();
while(i<len){
if(-1==j||T[i]==T[j])
{
i++;
j++;
next[i]=j;
/*
if(T[i]!=T[j]) //优化特殊情况
{
next[i]=j;
}
else
{
next[i]=next[j];
}
*/
}
else
{
j=next[j];
}
}
}
int main()
{
cin>>S;
cin>>T;
getNext();
KMP();
for(int i=0;i<=T.length();i++)
{
cout<<next[i]<<" ";
}
return 0;
}
KMP
最新推荐文章于 2024-10-12 17:27:27 发布