#include <cstdio>
#include <cstdlib>
typedef char* Sstring;
//求字符串长度
int Length(Sstring s)
{
int index=0;
while(s[index]!='\0')
{
++index;
}
return index;
}
//获得Next数组
void GetNext(Sstring T,int next[])
{
int i=0;
int j=-1;
next[0]=-1;
while(i<Length(T)-1)
{
if(j==-1 ||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
{
next[i]=j;
}
else
{
next[i]=next[j];
}
}
else
{
j=next[j];
}
}
}
//kmp算法
int Kmp(Sstring S,Sstring T,int pos)
{
int i=pos-1;
int j=0;
int jt=Length(T);
int is=Length(S);
int next[30];
GetNext(T,next); //获得next数组
while(i<is && j<jt)
{
if(j==-1 || S[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j]; //T串根据next数组回溯
}
}
if(j==jt)
{
return i-j+1; //匹配成功返回T串在S串中的位置
}
else
{
return -1; //-1表示没有匹配到T串
}
}
//测试代码
int main()
{
Sstring s="aadgdgdggaantb";
Sstring t="gdg";
printf("\n位置为:%d\n\n",Kmp(s,t,1));
return 0;
}
模式匹配 KMP C语言算法实现
最新推荐文章于 2021-05-23 16:06:59 发布