KMP算法C代码描述

/*

 *作者JunyiSun @ CCNU

 *E-MAIL:CCNUSJY@GMAIL.COM

 *KMP算法C代码描述

*/

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX_S 101      /*主串的长度最大值为100*/

#define MAX_P 21 /*模式串的长度最大值为20*/

 

char s[MAX_S],p[MAX_P];  /*s为主串,p为模式串*/

int nextv[MAX_P]; /*pnextv数组*/

 

void init_nextv()

{

       int i=0,j=-1;

       int p_len; /*模式串的长度*/

       p_len=strlen(p);

       nextv[0]=-1;

       while(i<p_len-1){

              if(j==-1 || p[i]==p[j]){

                     ++i;++j;

                     if(p[i]!=p[j])nextv[i]=j;

                     else nextv[i]=nextv[j];

              }

              else j=nextv[j];

       }

}

 

int kmp()

{

       int i=0,j=0,s_len,p_len;

       s_len=strlen(s);

       p_len=strlen(p);

       while(i<s_len && j<p_len){

              if(j==-1 || s[i]==p[j]){

                     i++;j++;

              }

              else j=nextv[j];

       }

       if(j==p_len)return i-p_len;

       else return -1;

}

 

 

int main()

{

       int index=0;

       printf("请输入主串:");

       scanf("%s",s);

       printf("请输入子串:");

       scanf("%s",p);

       init_nextv();

       index=kmp();

       if(index!=-1)

              printf("匹配成功,匹配位置%d/n",index);

       else

              printf("匹配失败/n");

       system("pause");

       return 0;

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值