现在的位置: 首页 > 综合 > 正文

KMP算法C代码描述

2013年08月31日 ⁄ 综合 ⁄ 共 1139字 ⁄ 字号 评论关闭

/*

 *作者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;

}

 

抱歉!评论已关闭.