社区讨论
这样的KMP模板还能怎样优化
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi7wb1bm
- 此快照首次捕获于
- 2025/11/21 04:40 4 个月前
- 此快照最后确认于
- 2025/11/21 04:40 4 个月前
RT,如下:
CPPvector<int> get_next(string s) { // 求出next数组
vector<int> nxt; nxt.push_back(-1);
int id = -1, n = s.size();
for (int i=1; i<n; ++i) {
while ((id>=0) && (s[i]!=s[id+1])) id = nxt[id];
if (s[i]==s[id+1]) ++id;
nxt.push_back(id);
}
return nxt;
}
vector<int> find_pos(vector<int> nxt, string s, string s2) { // 查询所有位置
vector<int> res;
int id = -1, n = s.size(), n2 = s2.size();
for (int i=0; i<n; ++i) {
while ((id>=0) && (s[i]!=s2[id+1])) id = nxt[id];
if (s[i]==s2[id+1]) ++id;
if (id+1==n2) {
res.push_back(i-n2+1); id = nxt[id];
}
}
return res;
}
int find_first(vector<int> nxt, string s, string s2) { // 查询第一个位置
int id = -1, n = s.size(), n2 = s2.size();
for (int i=0; i<n; ++i) {
while ((id>=0) && (s[i]!=s2[id+1])) id = nxt[id];
if (s[i]==s2[id+1]) ++id;
if (id+1==n2) return i-n2+1;
}
return -1;
}
vector<int> kmp_find(string text_str, string search_str) {
return find_pos(get_next(search_str), text_str, search_str);
}
int kmp_find_first(string text_str, string search_str) {
return find_first(get_next(search_str), text_str, search_str);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...