KMP

int * CreateNextArray(char *str2,int nlen2)
{
    int * next=(int *)malloc(sizeof(int)*nlen2);
    next[0]=-1;
    if(nlen2==1)
    {
        return next;
    }

    next[1]=0;
    int i=2;
    int cn=0;
    while(i<nlen2)
    {
        if(str2[i-1] == str2[cn])
        {
            next[i++]=++cn;
        }
        else if(cn>0)
        {
            cn=next[cn];
        }
        else
        {
            next[i++]=0;
        }
    }
    return next;
}



int KMP(char *str1,int nlen1,char *str2,int nlen2)
{
    if(nlen2>nlen1 || nlen1<=0 || nlen2 <=0) return -1;

    int *next=CreateNextArray(str2,nlen2);
    // for(int i=0;i// {
    //     cout<// }
    cout<<endl;
    int i=0;
    int j=0;
    while(inlen2)
    {
        if(str1[i] == str2[j])
        {
            i++;
            j++;
        }
        else if(next[j]<0)
        {
            i++;
        }
        else
        {
            j=next[j];
        }
    }

    // cout<
    return j==nlen2 ? i-j:-1;

}

 

你可能感兴趣的:(KMP)