//KMP.cpp
#include"predefined.h"
#include"SequenceString.h"
Status Index(SString S,SString T,int pos)
//算法4.5:T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
{
int i,j;
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int Index_KMP(SString S,SString T,int pos,int next[])
//算法4.6:利用模式串T的next函数求T在主串S中第pos个字符之后的位置的
//KMP算法。其中,T非空,1<=pos<=StrLength(S)
{
int i,j;
i=pos;
j=0;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
void get_next(SString T,int next[])
//算法4.7:求模式串的next函数值并存入数组next
{
int i,j;
next[1]=0;