社区讨论

这样的KMP模板还能怎样优化

学术版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7wb1bm
此快照首次捕获于
2025/11/21 04:40
4 个月前
此快照最后确认于
2025/11/21 04:40
4 个月前
查看原帖
RT,如下:
CPP
vector<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 条回复,欢迎继续交流。

正在加载回复...