#include<iostream>
#include<string.h>
using namespace std;
typedef struct
{
char ch[50];
int length;
}SString;
int Index_BF(SString S,SString T,int pos)
{
int i=pos-1;
int j=0;
int n=0;
while(i<S.length&&j<T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}else
{
i=i-j+1;
j=0;
}
n++;
}
cout<<"BF一共比较了"<<n<<"次"<<endl;
if(j>=T.length) return i-T.length+1;
else return 0;
}
void get_next(SString T,int next[])
{
int i=0;
next[0]=-1;
int j=-1;
while(i<T.length)
{
if(j==-1||T.ch[i]==T.ch[j])
{
++i;
++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int Index_KMP1(SString S,SString T,int pos)
{
int i=pos-1;
int j=0;
int n=0;
int next[20];
get_next(T,next);
while(i<S.length&&j<T.length)
{
if(j==-1||S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
j=next[j];
}
n++;
}
cout<<"KMP一共比较了"<<n<<"次"<<endl;
if(j>=T.length) return i-T.length+1;
else return 0;
}
void get_nextval(SString T,int nextval[])
{
int i=0;
nextval[0]=-1;
int j=-1;
while(i<T.length)
{
if(j==-1||T.ch[i]==T.ch[j])
{
i++;
j++;
if(T.ch[i]!=T.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int Index_KMP2(SString S,SString T,int pos)
{
int i=pos-1;
int j=0;
int n=0;
int nextval[20];
get_nextval(S,nextval);
while(i<S.length&&j<T.length)
{
if(j==-1||S.ch[i]==T.ch[j])
{
i++;
j++;
n++;
}
else
{
if(j!=-1) n++;
j=nextval[j];
}
}
cout<<"改进KMP一共比较了"<<n<<"次"<<endl;
if(j>=T.length) return i-T.length+1;
else return 0;
}
int main()
{
SString S,T;
int pos,BF,KMP1,KMP2;
cout<<"请输入主串:"<<endl;
cin>>S.ch;
cout<<"请输入子串:"<<endl;
cin>>T.ch;
cout<<"请输入要从主串的第几个位置开始匹配:"<<endl;
cin>>pos;
S.length=strlen(S.ch);
T.length=strlen(T.ch);
BF=Index_BF(S,T,pos);
KMP1=Index_KMP1(S,T,pos);
KMP2=Index_KMP2(S,T,pos);
cout<<"BF子串位置:"<<BF<<endl;
cout<<"KMP子串位置:"<<KMP1<<endl;
cout<<"改进KMP子串位置:"<<KMP2<<endl;
}
03-24
2705

12-17
1850

10-29
2344

04-21
3693

05-26
2279
