扩展KMP算法

Posted houzena

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展KMP算法相关的知识,希望对你有一定的参考价值。

KMP算法中也涉及到子串与前缀的重复,而扩展KMP算法求得就是字符串S的所有后缀与字符串T的最长公共前缀

可以知道,一个字符串所有的子串便是这个字符串所有后缀的所有前缀(或前缀的后缀 ),那么求的信息其实也是字符串S的所有子串与字符串T前缀的重复

每个后缀的最长公共前缀长度存在一个extend数组中,具体代码没有研究,给当模板用了。。

void getextend() {
    int p = 0;
    while (p < m && p < n && s[p + 1] == t[p + 1]) {   //计算第一个后缀
        p++;
    }
    extend[1] = p;
    int k = 1, l;
    for (int i = 2; i <= m; i++) {
        p = k + extend[k] - 1;
        l = next[i - k + 1];
        if (i + l <= p) {
            extend[i] = l;
        } else {
            int j = p - i + 1;
            if(j < 0) j = 0;
            while(i + j <= m && j + 1 <=n && s[i + j] == t[j + 1])    j ++;
            extend[i] = j;
            k = i;
        }
    }
}

  

推荐个题目,旋转数字 : http://acm.hdu.edu.cn/showproblem.php?pid=4333

 

以上是关于扩展KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

扩展kmp算法 学习扩展kmp算法 学习(粗)

扩展KMP模板

扩展KMP算法小记

(模板)扩展kmp算法(luoguP5410)

KMP && Manacher && 扩展KMP整理

POJ-2752(KMP算法+前缀数组的应用)