首页 > 编程语言 > 详细

【字符串】KnuthMorrisPratt算法

时间:2020-12-01 13:57:06      阅读:28      评论:0      收藏:0      [点我收藏+]

下标均从1开始。
字符串 \(s\) 的前缀函数 \(\pi[i]\) 表示长度为 \(i\) 的前缀中最长的 border 的长度。
kmp 找出模式字符串 \(t\) 在文本字符串 \(s\) 中出现的所有的位置。

namespace KnuthMorrisPratt {

    vi getPi(char *s) {
        int slen = strlen(s + 1);
        vi pi(slen + 1);
        for(int i = 2, j = 0; i <= slen; ++i) {
            for(; j && s[i] != s[j + 1]; j = pi[j]);
            j += (s[i] == s[j + 1]);
            pi[i] = j;
        }
        return pi;
    }

    vi kmp(char *s, char *t) {
        int slen = strlen(s + 1), tlen = strlen(t + 1);
        vi pi = getPi(t), res;
        for(int i = 1, j = 0; i <= slen; ++i) {
            for(; j && s[i] != t[j + 1]; j = pi[j]);
            j += (s[i] == t[j + 1]);
            if(j == tlen)
                res.pb(i - tlen + 1);
        }
        return res;
    }

}

【字符串】KnuthMorrisPratt算法

原文:https://www.cnblogs.com/purinliang/p/14067447.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!