KMP与扩展KMP算法

  • 字符串的特征向量:第i(0开始计数)个元素表示从第一个字符到第i个字符首尾最多匹配多少个字符.

注意是字串匹配

例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2)

对于每个字符,暴力比较耗时。可看出每个字符的特征值可以由它之前的字符推出:用next[i]表示到第i个字符首尾匹配的字符数。则对于字符i,我们设next[i-1]为x,若p[i]=p[x],则正好在前一个匹配后往后再加一个,所以next[i]=x+1,若不等于,则从p[i-1]开始倒着与p[i]比较(因为后一个从首往后能匹配的长度最多到前面的+1),若相等,则如下图i处用三角形表示与左边三角形相等,而左边三角形处匹配到紫色区相等,所以i能匹配到最左边紫色区。若不能,则继续往前一个比较。

next[]:

void getNext(char const P[],int n,int next[]){
    next[0] = 0;
    for(int i=1;i<n;++i){
        int k = next[i-1];
        while( k > 0 && P[k] != P[i] ) k = next[k-1];
        next[i] = ( P[i] == P[k] ) ? k + 1 : 0;
    }
    return;
}

猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/89321228