KMP算法

来源:互联网 发布:8097端口 编辑:程序博客网 时间:2024/06/08 20:04
#include<cstdio>#include<cstring>int next[100];char a[100];char b[100];void getnext(char *t,int n)//next数组表示前缀子串和后缀子串的最大重和的长度 {                          //例如:a  b  a  b  a     int j=0,i=0;           //    -1  0  0  1  2    next[i]=-1;j=next[i]; //首个字母无前缀和后缀初始化为0或-1             while(i<n)            //第四个字母的最大重合长度的子串为 :a     {                     //第五个人为:a b          if(j==-1||t[i]==t[j])        {            i++;j++;            next[i]=j;        }        else        j=next[j];      }       }int kmp(char *t1,int n1,char *t2,int n2){    int i=0,j=0;    while(i<n1)    {        if(j==-1||t1[i]==t2[j])        {            i++;j++;//一个字母匹配成功后,匹配下一个             if(j==n2)//子串的长度是不会变的当匹配得到长度达到n2是说明找到子串             {                return i-n2+1;//找到子串 返回位置                 break;            }        }        else        j=next[j];  //跳到 另一个重合子串处并重新匹配看是否符合条件     }               //直到跳出循环或找到子串     return -1;}int main(){    scanf("%s%s",a,b);//a串为长串,b串为子串     int len1=strlen(a);    int len2=strlen(b);    getnext(b,len2);//获得next数组     //for(int i=0;i<len1;i++)    //printf("%d ",next[i]);    //printf("\n");    printf("%d",kmp(a,len1,b,len2));return 0;   }