KMP算法

来源:互联网 发布:镜片种类知乎 编辑:程序博客网 时间:2024/05/17 16:03
/**  整体思路*  第一步,利用一个next数组,储存求出的模式串的回溯方案*  第二步,常规BF算法更改,将匹配失败之后的模式串指针利用next[j]求出*  第三步,常规运算*/#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;#define MAX 1005void GETNEXT(char a[],int next[])//计算模式串的next数组{    memset(next,0,sizeof(0));//数组清零    int j=0,k=-1;    int zz;    zz=strlen(a);    next[0]=-1;    while(zz--)    {        if(k==-1||a[k]==a[j])        {            k++;            j++;            next[j]=k;        }        else        {            k=next[k];        }    }}int KMP(char a[],char b[])//KMP算法{    int next[MAX],i=0,j=0;    int m,n;    m=strlen(a);    n=strlen(b);    GETNEXT(b,next);//调用函数,计算模式串b的next数组值    while(i<m&&j<n)//类似于常规的BF算法思路    {                if(a[i]==b[j]||j==-1)        {            i++;            j++;        }        else        {            j=next[j];//j进行回溯        }    }    if(j==n)    {        return (i-n+1);//返回模式串在主串中的位置    }    else    {        return -1;//没有返回-1    }}int main(){    char a[100000+5],b[MAX];    while(scanf("%s%s",a,b)!=EOF)    {        cout<<KMP(a,b)<<endl;    }   return 0;}

0 0
原创粉丝点击