kmp算法next数组的理解和代码

例如模式串  “abaabcac”

思路:先从一个一个的字符,然后找他的对称,有一个字母关于某一条轴对称,就为1,两个字母关于某一条直线对称,为2。找到这个分成的字符串的最大值。

根据定义 j=1时,next【j】=0;然后加1存入数组当中,即可得到next数组中相关的值。

如果你是定义的 j=1;next【j】=-1;那么就不需要加1

a    0

ab  0

aba      a b a  0 1 选取最大值1

abaa    a ba a  1

abaab   ab a ab ab关于字符a对称   2

abaabc  0

abaabca   a baabc a 1

1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3 1 2

理解这个以后,我们在看next的代码

void getnext(char b[],int next[])
{
    int i=1,j=0;
    next[1]=0;   //定义的是j=1 next[1]=0;
    while(i<strlen(b))   
    {
        if(j==0||b[i]==b[j]){
            i++;
            j++;
            next[i]=j;
        }
        else j=next[j];
    }
}

最后是kmp的算法,比较好理解

int kmp(char a[],char b[],int pos,int next[])
{
    int i=pos,j=1,cnt=0;
    while(i<=strlen(a)&&j<=strlen(b))
    {
        if(j==0||a[i]==b[j])
        {
            i++;
            j++;
        }
        else j=next[j];
    }
    if(j>strlen(b)) return i-strlen(b);
    else return 0;
}

猜你喜欢

转载自blog.csdn.net/hujinhong145/article/details/80027246