C双指针滑动窗口算法

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

原理

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

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

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

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

代码
cpp 复制代码
#include <stdio.h>

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
问题

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

⽆重复字符的最⻓⼦串?


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

相关推荐
eachin_z34 分钟前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹42 分钟前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
钮钴禄·爱因斯晨43 分钟前
Java 面向对象进阶之多态:从概念到实践的深度解析
java·开发语言·数据结构
机器学习之心1 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
AL流云。1 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法
qq_429879672 小时前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码3 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习3 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
yzx9910134 小时前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn
iCxhust4 小时前
Prj10--8088单板机C语言8259测试(1)
c语言·开发语言