写模板,kmp。

1 为什么要写kmp? 因为find暴力匹配函数,时间复杂度过高,因为s串指针回溯问题。
2 为了避免s串指针回溯,对t串构建kmp表,该表记录了当前位置匹配失效时,下一个比较的下标。
3 原理?next表表示了当前下标j的最长公共前后缀长度,因为下标从0开始,这个长度也是最长公共前缀的下一个位置,也就是说,当在j匹配失效时,我们可以直接跳到next[j - 1]来进行匹配,避免了i指针回溯。

vector<int> getKmpTable(const string& t){
	int m = int(t.size());
	int len = 0, j = 1;
	vector<int> next(m);
	while (j < m){
		if (t[j] == t[len]){
			next[j ++] = ++len;
		}
		else if (len){
			len = next[len - 1];
		}
		else{
			j ++;
		}
	}
	return next;
}

在构建表格时,len指针可以看作模式匹配时的j指针,而j可以看作i指针。len的回溯,代表了len下标与j无法继续相等,如果len不为1,那么下次比较的位置可以直接跳到next[len - 1],因为0~len是一个已经匹配成功的位置,所以这一段的公共前后缀无需再匹配。

posted @   _Yxc  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示