字符串 – KMP前缀表

我正在阅读有关KMP的字符串匹配。
它需要通过构建前缀表来对模式进行预处理。
例如对于字符串ababaca,前缀表是:P = [0,0,1,2,3,0,1]
但我不清楚数字显示的是什么。我读到它有助于找到匹配的模式,当它改变,但我不能连接这个信息与表中的数字。
最佳答案
每个数字都属于相应的前缀(“a”,“ab”,“aba”,…),对于每个前缀,它表示与前缀匹配的该字符串的最长后缀长度。我们不会将整个字符串作为后缀或前缀,它被称为自我后缀和自身前缀(至少在俄语中,不能确定英文的术语)。

所以我们有字符串“ababaca”。我们来看看吧KMP为每个非空前缀计算前缀函数。我们将P(i)定义为第i个前缀的前缀函数。粗体部分显示匹配的前缀,斜体部分显示匹配的后缀。零件可以重叠。

#| String | P(#)|最长匹配的前缀后缀
0 | “a”| 0 | “”
1 | “ab”| 0 | “”
2 | “aba”| 1 | “a” – a b a
3 | “abab”| 2 | “ab” – ab ab
4 | “ababa”| 3 | “aba” – ab a ba
5 | “ababac” | 0 | “”
6 |“ababaca”| 1 | “a” – 一个babac a

计算字符串S的前缀函数的简单C代码:

vector<int> PrefixFunction(string S) {
    vector<int> p(S.size());
    int j = 0;
    for (int i = 1; i < (int)S.size(); i++) {
        while (j > 0 && S[j] != S[i])
            j = p[j-1];

        if (S[j] == S[i])
            j++;
        p[i] = j;
    }   
    return p;
}

转载注明原文:字符串 – KMP前缀表 - 代码日志