KMP字符串模式匹配算法实现

时间:2024-10-10 07:40:29
  • #include<>
  • #include<>
  • #include<>
  • typedef struct
  • {
  • char *ch;
  • }SString;
  • void InitString(SString *P);
  • void StrAssign(SString *P,char charc[]);
  • void Get_next(SString *P,int next[]);
  • int Index_KMP(SString *S,SString *T,int next[]);
  • void InitString(SString *P)
  • {
  • P->ch='\0';
  • return ;
  • }
  • void StrAssign(SString *P,char charc[])
  • {
  • int i,len;
  • if(P->ch)
  • free(P->ch);
  • len=strlen(charc);
  • if(!charc)
  • {
  • P->ch='\0';
  • }
  • else
  • {
  • P->ch=(char *)malloc((len+1)*sizeof(char));
  • if(!P->ch)
  • {
  • exit(-1);
  • }
  • else
  • {
  • for(i=0;i<len;i++)
  • {
  • P->ch[i+1]=charc[i];
  • }
  • P->ch[0]=len;
  • }
  • }
  • return ;
  • }
  • void Get_next(SString *P,int next[])
  • {
  • int i=1;
  • next[1]=0;
  • int j=0;
  • while(i<P->ch[0])
  • {
  • if(j==0||P->ch[i]==P->ch[j])
  • {
  • ++i;
  • ++j;
  • next[i]=j;
  • }
  • else
  • j=next[j];
  • }
  • return ;
  • }
  • int Index_KMP(SString *S,SString *T,int next[])
  • {
  • int i=1,j=1;
  • while(i<=S->ch[0]&&j<=T->ch[0])
  • {
  • if(S->ch[i]==T->ch[j])
  • {
  • ++i;
  • ++j;
  • }
  • else
  • {
  • j=next[j];
  • if(j==0)
  • {
  • i++;
  • j=1;
  • }
  • }
  • }
  • if(j==T->ch[0]+1)
  • return i-T->ch[0];
  • else
  • return 0;
  • }
  • int main()
  • {
  • int i,pos;
  • int Next[100];
  • char chara[101];
  • char charb[101];
  • SString S,T;
  • for(i=0;i<3;i++)
  • {
  • InitString(&S);
  • InitString(&T);
  • scanf("%s%s",chara,charb);
  • StrAssign(&S,chara);
  • StrAssign(&T,charb);
  • Get_next(&T,Next);
  • pos=Index_KMP(&S,&T,Next);
  • printf("%d\n",pos);
  • }
  • return 0;
  • }