kmp

来源:互联网 发布:河北知满天教育官网 编辑:程序博客网 时间:2024/06/01 18:26
#include<stdio.h>
#include<string.h>
#define MAX 100
typedef char datatype;
typedef struct
{
 datatype data[MAX];
 int len;
}Sstring;
//求模式串t的next函数值,存入next
void  GetNext(datatype *t,int *next,int length)
{
 int i=1,j=0;
 next[1]=0;
 while(i<length)
 {
  if(j==0||t[i]==t[j])
  {
   ++i;
   ++j;
   next[i]=j;//继续比较后续字符
  }
  else
   j=next[j];//模式串后移
 }
}
//利用模式串t的next函数,求s第pos个字符后的位置
int Index(datatype *s,datatype *t,int pos,int tlength,int slength,int *next)
{
 int i=pos,j=1;
 while(i<=slength&&j<=tlength)
 {
       if(j==0||s[i]==t[j])
    {
     ++i;
     ++j;
    }
    else
     j=next[j];
 }
 if(j>tlength)
  return i-tlength;
 else
  return 0;
}
int main()
{
 int locate,tlength,slength,next[256];
 datatype s[256],t[256];
 printf("please input first string S: \n");
 slength=strlen(gets(s+1));
 printf("please input second string T:\n");
 tlength=strlen(gets(t+1));
 GetNext(t,next,tlength);
 locate=Index(s,t,0,tlength,slength,next);
 printf("匹配位置: %d\n",locate);
 return 0;
}
0 0