kmp

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值