C双指针滑动窗口算法
创始人
2025-01-09 12:06:11
0

这也许是双指针技巧的最⾼境界了,如果掌握了此算法,可以解决⼀⼤类⼦字符串匹配的问题

原理

1、我们在字符串 S 中使⽤双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为⼀个「窗⼝」。

2、我们先不断地增加 right 指针扩⼤窗⼝ [left, right],直到窗⼝中的字符串 符合要求(包含了 T 中的所有字符)。

3、此时,我们停⽌增加 right,转⽽不断增加 left 指针缩⼩窗⼝ [left, right],直到窗⼝中的字符串不再符合要求(不包含 T 中的所有字符了)。 同时,每次增加 left,我们都要更新⼀轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

代码
#include   const char* matchString(const char* content, const char* sub) { 	// 数据初始化 	size_t size = strlen(content); 	size_t sub_size = strlen(sub); 	int flag[256] = {0};		// 字符数统计 	 	// 搜索区间 	const char* begin = content; 	const char* end = content + size; 	 	// 双指针动态滑动窗口 	const char* _left = begin; 	const char* right = begin; 	 	// 滑动匹配 	for(;right < end; ++right) { 		++flag[*right];	// 窗口内字符数统计 		 		// 缩小窗口,寻找可行解 		int i = 0; 		for(; i < sub_size;) { 			if(right - _left < sub_size) 				break;	// 窗口失效 			if(!flag[*(sub + i)]) 				break; // 窗口失效 			if(*(_left + i) != *(sub + i)) { 				--flag[*(_left + i)]; // 窗口内字符数更新 				++_left; 				i= 0; 				continue;	// 缩小窗口,重新匹配 			} 			++i; 		} 		 		if(i == sub_size) 			return _left;  // 查找成功 	} 	return end;	// 查找失败 } 	 int main () { 	printf("%s\n", matchString("abccbaaabcbaabcacbacb", "acb")); 	return 0; }
输出
acbacb
问题

找到字符串中所有字⺟异位词?

⽆重复字符的最⻓⼦串? 


创作不易,小小的支持一下吧!

相关内容

热门资讯

7分钟窍要!福建天天开心辅助,... 7分钟窍要!福建天天开心辅助,九哥玩辅助(辅助)切实真的是有下载(哔哩哔哩)1、实时福建天天开心辅助...
第四分钟攻略!熟客温州游戏辅助... 第四分钟攻略!熟客温州游戏辅助器,新九哥脚本(辅助)其实是真的辅助器(哔哩哔哩)运熟客温州游戏辅助器...
第七分钟机巧!雀友会潮汕麻雀总... 第七分钟机巧!雀友会潮汕麻雀总部辅助,新鸿狐挂机(辅助)都是存在有软件(哔哩哔哩)1、雀友会潮汕麻雀...
第7分钟项目!中至江西插件,新... 第7分钟项目!中至江西插件,新道游拼十辅助器(辅助)一直真的有app(哔哩哔哩)1、新道游拼十辅助器...
第一分钟大纲!家家盘锦开挂,反... 第一分钟大纲!家家盘锦开挂,反杀新大厅辅助(辅助)真是存在有app(哔哩哔哩)1、操作简单,无需反杀...
第5分钟绝活儿!白银胡乐辅助脚... 第5分钟绝活儿!白银胡乐辅助脚本下载,新超圣辅助器(辅助)本来真的有工具(哔哩哔哩)1、白银胡乐辅助...
第六分钟指南书!皇豪互娱控制系... 第六分钟指南书!皇豪互娱控制系统app,新超圣正版辅助(辅助)切实是有插件(哔哩哔哩)所有人都在同一...
五分钟教程书!闲逸辅助器辅助下... 五分钟教程书!闲逸辅助器辅助下载,随意玩app下载开挂辅助(辅助)好像是真的工具(哔哩哔哩)1、这是...
第一分钟大纲!家家盘锦开挂,反... 第一分钟大纲!家家盘锦开挂,反杀新大厅辅助(辅助)真是有挂工具(哔哩哔哩)1.反杀新大厅辅助 选牌创...
第5分钟窍门!四川麻将血战到底... 第5分钟窍门!四川麻将血战到底定制插件辅助,新祥心挂机(辅助)原来真的有工具(哔哩哔哩)1、四川麻将...