#include <algorithm>
#include <iostream>
#include<cstring>
using namespace std;
int next[30];
void getnext(string T,int *next)//字符串T和next的脚标需要从1开始
{
int i=1;
next[1]=0;// 规定next数组第一位为0
int j=0;
while(i<T.length())
{
if(j==0||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];//回溯!!!
}
}
int vala(string S,string T,int *next)
{
int is=1,jt=1;
cout<<"S.L "<<S.length()-1<<" T.L "<<T.length()-1<<endl;
while(is<=S.length()&&jt<=T.length())
{
if(jt==0||S[is]==T[jt])
{
is++;
jt++;
}
else
jt=next[jt];
if(jt>T.length()-1)
return (is-T.length()+1);
}
return 0;
}
int main()
{
// freopen("r","text.txt",stdin);
string Sstr;
cin>>Sstr;
Sstr="S"+Sstr;
string Tstr;
cin>>Tstr;
Tstr="T"+Tstr;
getnext(Tstr,next);
for(int i=0;i!=Tstr.length();i++)
cout<<Tstr[i]<<' ';
cout<<endl;
for(int i=0;i!=Tstr.length();i++)
cout<<next[i]<<' ';
cout<<endl;
cout<<vala(Sstr,Tstr,next);
system("pause");
return 0;
}
KMP
最新推荐文章于 2024-11-16 09:45:51 发布