KMP中next数组优化与非优化版本

非优化版:

求的是前后缀最大匹配值,一般用于求最小循环节

求最小循环节:

设字符串为S,长度为n

循环节长度len = n - next[n];

(1)如果n可以被len整除 那说明S完全由循环节组成,循环周期为 n/len

(2)如果不能,说明还需要添加几个字母才可以补全

需要添加的个数为:len - n %len

void getnext(char s[], int nex[],int len)
{
    int j = 0, k = -1;
    nex[0] = -1;

    while(j < len)
    {
        while(k != -1 && s[j] != s[k])
            k = nex[k];

        nex[++j] = ++k;
    }
}

优化版:

一般与KMP算法一块用与求字符串位置,在运用KMP时,使用第二种算法,因为避免了多余的判断,更加高效

void getNext(char s[],int nex[],int len)
{
    nex[0] = -1;
    int k = -1;

    for(int q = 1;q <= len; q ++)
    {
        while(k > -1 && s[k+1] != s[q])
            k = nex[k];

        if(s[k+1] == s[q])
            k ++;

        nex[q] = k;
    }
}

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/81254434