目录
- 1 介绍
- 1.1 Z函数算法
- 2.2 KMP算法
- 2 训练
1 介绍
1.1 Z函数算法
Z函数算法,也叫作扩展KMP算法。它用来求取文本串text
和模式串pattern
的匹配位置。
首先介绍lcp(s1,s2)
函数,它表示字符串s1
和字符串s2
的最大公共前缀长度。那么z[i] = lcp(text, text[i:])
。
求取z数组的代码如下,
int n = text.size();
vector<int> z(n, 0);
int left = 0, right = 0;
for (int i = 1; i < n; ++i) {if (i <= right) {z[i] = min(z[i - left], right - i + 1);}while (i + z[i] < n && text[z[i]] == text[i + z[i]]) {left = i;right = i + z[i];z[i] += 1;}
}
然后求取文本串text
中模式串pattern
的位置,可以按照以下步骤:
- 构造新串
s
:s = pattern + text
。 - 计算新串
s
的z数组。 - 最终答案为满足
i >= pattern.size() && z[i] >= pattern.size()
的下标i
。
2.2 KMP算法
待补充…
2 训练
831KMP字符串
3031将单词恢复初始状态所需的最短时间II
3036匹配模式数组的子数组数目II