#include <iostream>
using namespace std;
struct SqString
{
char data[20];
int length;
};
void GetNext(SqString t,int next[])
{
next[0]=-1;
int j=0,k=-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 MKPIndex(SqString s,SqString t)
{
int next[t.length],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);
else
return(-1);
}
int main()
{
SqString S={'a','b','a','b','c','a','c','b','a','b'};
S.length=10;
SqString T={'a','b','c','a','c'};
T.length=5;
if(MKPIndex(S,T)==-1)
cout<<"不匹配";
else
cout<<"目标串从第"<<MKPIndex(S,T)+1<<"字符开始匹配";
return 0;
}
详细解释请看: