改进后的KMP算法

#include<bits/stdc++.h>

#define MaxSize 50

typedef struct

{

 char data[MaxSize];

 int length;

}SqString;

//创建串 

void StrAssign(SqString &s,char cstr[])

{

 int i;

 for(i=0;cstr[i]!='\0';i++)

 {

  s.data[i]=cstr[i];

 }

 s.length=i;

}

void GetNextval(SqString t,int nextval[])

{

 int j=0,k=-1;

 nextval[0]=-1;

 while(j<t.length)

 {

  if(k==-1 || t.data[j]==t.data[k])

  {

   k++;

   j++;

   if(t.data[j]!=t.data[k])

   {

    nextval[j]=k;

   }

   else

   {

    nextval[j]=nextval[k];

   }

  }

  else

  {

   k=nextval[k];

  }

 }

}

int KMPIndex(SqString s,SqString t)

{

 int nextval[MaxSize],j=0,i=0;

 GetNextval(t,nextval);

 while(i<s.length && j<t.length)

 {

  if(j==-1 || s.data[i]==t.data[j])

  {

   i++;

   j++;

  }

  else

  {

   j=nextval[j];

  }

 }

 if(j>=t.length)

 {

  return(i-t.length);

 }

 else

 {

  return(-1);

 }

}

void DispStr(SqString s)

{

 int i;

 if(s.length>0)

 {

  for(i=0;i<s.length;i++)

  {

   printf("%c",s.data[i]);

  }

  printf("\n");

 }

}

int main()

{

 SqString s,ss;

 int i;

 char a[]="aaaaab";

 char b[]="aaab";

 StrAssign(s,a);

 StrAssign(ss,b);

 DispStr(s);

 DispStr(ss);

 i=KMPIndex(s,ss);

 printf("%d",i);

}

猜你喜欢

转载自blog.csdn.net/2302_77099705/article/details/130440259