首先维护一个前缀表。
前缀表求解过程如下:
搜索这个词的所有前缀表prefix table
ababc的prefix table: a ab aba abab ababc
以abab为例,最长前缀和最长后缀相等时,为ab。长度是2。
最后得到的前缀表为
开始模拟kmp匹配过程
继续寻找
极端的例子
维护前缀表,如下
模拟开始,
第一次,
向右移动一个,从比较失败的地方开始匹配。
代码
求前缀表
不相等时v
kmp search
模板
KMP —— 模板题 AcWing 831. KMP字符串
// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度
求模式串的Next数组:
for (int i = 2, j = 0; i <= m; i ++ )
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++ ;
ne[i] = j;
}
// 匹配
for (int i = 1, j = 0; i <= n; i ++ )
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++ ;
if (j == m)
{
j = ne[j];
// 匹配成功后的逻辑
}
}
来自: https://www.acwing.com/blog/content/404/
参考:
视频链接:
1、https://www.bilibili.com/video/BV1Px411z7Yo?from=search&seid=13944158981303497729
2、https://www.bilibili.com/video/BV1hW411a7ys/?spm_id_from=autoNext