学代码最爽的一件事就是自己用笔把代码一步步推出来,然后再手打进电脑里面一次无伤通过。
课上实验题,自己又用笔推了一遍。
#include<iostream>
#include<string>
using namespace std;
class myString
{
protected:
int size;
string mainstr;
void GetNext(string p,int next[]);
int KMPFind(string p,int pos,int next[]);
public:
myString();
~myString();
void SetVal(string sp);
int KMPFindSubstr(string p,int pos);
};
myString::myString()
{
size=0;
mainstr="";
}
myString::~myString()
{
size=0;
mainstr="";
}
void myString::SetVal(string sp)
{
mainstr="";
mainstr.assign(sp);
size=mainstr.length();
}
int myString::KMPFindSubstr(string p,int pos)
{
int i;
int L=p.length();
int *next=new int[L];
GetNext(p,next);
for(i=0;i<L;i++)cout<<next[i]<<' ';
cout<<endl;
int v=-1;
v=KMPFind(p,pos,next);
delete[]next;
return v;
}
void myString::GetNext(string p,int next[])
{
int i=0,j=-1;next[0]=-1;
while(i<p.length()-1)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int myString::KMPFind(string p,int pos,int next[])
{
int i=pos,j=1;
while(i<=mainstr.length()&&j<=p.length())
{
if(j==0||mainstr[i-1]==p[j-1])
{
i++;
j++;
}
else j=next[j-1]+1;
}
if(j>p.length())return i-p.length();
else return 0;
}
int main()
{
int T;
string _P,_F;
myString _M;
//第一个输入t,表示有t个实例
cin>>T;
while(T--)
{
//第二行输入第1个实例的主串,第三行输入第1个实例的模式串
cin>>_P>>_F;
_M.SetVal(_P);
cout<<_M.KMPFindSubstr(_F,1)<<endl;
}
return 0;
}
//ccbccbbaa
//012123411
实例