S-L19 字符串算法
覆盖词条:KS-59a/b | 先修:J-L10/S-L07
模板与代码
KMP
next 数组求失配指针;搜索时用分隔符拼接,返回模式串在文本串中的所有出现位置(0-based)。
| #include <bits/stdc++.h>
using namespace std;
// KMP:next 数组(失配指针),nx[i] = s[0..i] 的最长相等真前后缀长度 - 1
vector<int> next_array(const string& s) {
int n = (int)s.size();
vector<int> nx(n, -1);
for (int i = 1; i < n; i++) {
int j = nx[i - 1];
while (j != -1 && s[i] != s[j + 1]) j = nx[j];
if (s[i] == s[j + 1]) j++;
nx[i] = j;
}
return nx;
}
// 返回 pattern 在 text 中所有出现位置(0-based);分隔符需不在两串中出现
vector<int> kmp_search(const string& text, const string& pattern) {
string s = pattern + "#" + text;
auto nx = next_array(s);
vector<int> res;
int m = (int)pattern.size();
for (int i = m + 1; i < (int)s.size(); i++)
if (nx[i] == m - 1) res.push_back(i - 2 * m);
return res;
}
|
待补充
- 字符串哈希(自然溢出 / 双模)
- 朴素匹配与 KMP 的对比
- Z 函数(扩展 KMP,选学)
- Manacher 最长回文(选学)