代码
#include <iostream>
using namespace std;
typedef struct
{
char data[50];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[])
{
int i;
for(i=0;cstr[i]!='\0';i++)
{
s.data[i]=cstr[i];
}
s.length=i;
}
void DispStr(SqString s)
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
{
cout<<s.data[i];
}
cout<<endl;
}
}
void GetNext(SqString t,int next[])
{
int j,k;
j=0;k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k==-1||t.data[j]==t.data[k])
{
j++;k++;
next[j]=k;
}
else
k=next[k];
}
}
int KMPIndex(SqString s, SqString t)
{
int next[50],i=0,j=0;
GetNext(t,next);
while(i<s.length&&j<t.length)
{
if(j==-1||s.data[i]==t.data[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=t.length)
return(i-t.length+1);
else
return (-1);
}
int main()
{
SqString S,T;
int next[50];
char s[]="abcaabbabcabaacbacba";
char t[]="abcabaa";
StrAssign(S,s);
StrAssign(T,t);
cout<<"主串为s:";
DispStr(S);
cout<<endl<<"模式串为t:";
DispStr(T);
GetNext(T,next);
if(KMPIndex(S,T)==-1)
cout<<endl<<"不匹配";
else
cout<<endl<<"在位置为"<<KMPIndex(S,T)<<"匹配到";
return 0;
}
运行结果