//KMP.h
#ifndef KMP_H
#define KMP_H
#include <iostream>
using namespace std;
class KMP
{
public:
KMP(int longtht,int longths,char s[],char t[]);
int kmp();
void GetNext();
void PrintNext();
private:
char *S;
char *T;
int *next;
int Longtht;
int Longths;
};
KMP::KMP(int longtht,int longths,char s[],char t[])
{
S=new char[longths];
T=new char[longtht];
next=new int[Longtht-1];
for(int i=0;i<longths-1;i++)
S[i]=s[i];
S[longths-1]='\0';
for(int j=0;j<longtht-1;j++)
T[j]=t[j];
T[longtht-1]='\0';
Longtht=longtht;
Longths=longths;
}
void KMP::GetNext()
{
int k=-1,j=0;
next[0]=-1;
while(j<Longtht)
{
if(k==-1 || T[k]==T[j])
{
++k;
++j;
next[j]=k;
}
else
k=next[k];
}
}
void KMP::PrintNext()
{
for(int i=0;i<Longtht-1;i++)
cout<<"next["<<i<<"] = "<<next[i]<<endl;
}
int KMP::kmp()
{
int i=0,j=0;
while((S[i]!='\0')&&(T[j]!='\0'))
{
if(S[i]==T[j])
{ ++i;
++j;
}
else
{
j=next[j];
if(j==-1)
{ ++i;
++j;
}
}
}
if(T[j]=='\0') {
return (i-j+1);
}
else return 0;
}
#endif
//KMP.cpp
#include "KMP.h"
int main()
{
char S[10]="abcabcacb";
char T[6]="abcac";
cout<<"T="<<T<<endl;
cout<<"S="<<S<<endl;
KMP kmp(6,10,S,T);
kmp.GetNext();
kmp.PrintNext();
cout<<"子串在主串第几个元素开始匹配成功?(0表示匹配不成功)\n"<<kmp.kmp()<<endl;
return 0;
}