KMP&拓展KMP
Posted alessandro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP&拓展KMP相关的知识,希望对你有一定的参考价值。
KMP算法
解析
KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内找出匹配位置和匹配长度。
详解KMP
板子
(next)数组存在的意义:
当 (A) 串匹配到 (i), (B) 串匹配到 (j)时, 如果发现失配,可以直接令 (j = next[i]) 然后继续匹配, ( (next[i]) 将记录如果 (B) 串匹配到 (A) 的 (i) 位置,前面有多少是已经匹配了的。)
(next) 数组的求法
inline void calc_next() {
next[1] = 0;
for (int i = 2, j = 0; i <= n; ++ i) {
while (j > 0 && a[i] != a[j + 1]) j = next[j];
if (a[i] == a[j + 1]) j ++;
next[i] = j;
}
}
我们用(f)数组记录每个位置能匹配的个数,基于 (next) 数组,我们能在 (O(n + m)) 的时间处理结果
inline void calc_f() {
for (int i = 1, j = 0; i <= m; ++ i) {
while (j > 0 && (j == n || b[i] != a[j + 1])) j = next[j];
if (b[i] == a[j + 1]) j ++;
f[i] = j;
if (f[i] == n) {/* the first time */}
}
}
拓展KMP算法
以上是关于KMP&拓展KMP的主要内容,如果未能解决你的问题,请参考以下文章