KMP

#include <stdio.h>

#include <stdlib.h>

#include <string.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 argc, char *argv[])

{

       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");

}

posted on 2010-08-17 18:41  dyh333  阅读(116)  评论(0编辑  收藏  举报

导航