滑动窗口算法详解:如何求解最小覆盖子串问题
创作时间:
作者:
@小白创作中心
滑动窗口算法详解:如何求解最小覆盖子串问题
引用
CSDN
1.
https://m.blog.csdn.net/xsc2004zyj/article/details/144992191
在字符串处理和算法面试中,"最小覆盖子串"是一个经典问题。本文将详细讲解如何使用滑动窗口算法解决这个问题,包括算法原理、优化思路以及完整的代码实现。
一.题目描述
- 最小覆盖子串 - 力扣(LeetCode)
二.题目解析
题目要求在字符串s
中找到一个子串,该子串包含字符串t
的所有字符,并返回最短的子串。如果s
中不包含这样的子串,则返回一个空串。
需要注意的是:
- 如果字符串
t
包含重复字符(如"aaac"),那么在s
中寻找子串时必须包含所有字符,不能只出现一次。 - 子串中的字符顺序可以任意,只要包含
t
中的所有字符即可。
三.算法原理
1.暴力解法
暴力解法的基本思路是枚举所有可能的子串,使用哈希表统计每个子串的字符,当子串包含t
的所有字符时,记录其起始位置和长度。最后返回最短的符合条件的子串。
时间复杂度: O(N^2),因为需要反复遍历s
。
空间复杂度: O(1),虽然使用了哈希表,但存储的都是字母,空间是常数级的。
2.滑动窗口
可以对暴力枚举进行优化,采用滑动窗口算法:
- 进窗口: right位置的元素放入哈希表中
- 判断: 如果子串满足要求,就更新结果,然后让left位置的元素出窗口
- 时间复杂度: O(N+t),left和right最多各遍历一次
s
,判断时需要遍历哈希表 - 空间复杂度: O(1),字符集只有52个字母
3.滑动窗口优化
通过引入count
计数器来优化判断逻辑:
- 入窗口时: 如果该元素在两个哈希表的个数相等,说明这个字符已经满足
t
中该字符的出现要求,count++
- 出窗口前: 如果两个哈希表中该字符个数相等,说明该字符是有效字符,出去后
count--
- 判断逻辑:
count
统计有效字符的种类,与t
的哈希表大小进行比较
四.代码实现
在进行滑动窗口之前,需要记录t
的哈希表大小,因为在滑动窗口过程中,哈希表会插入元素导致大小变化。同时,需要记录子串的起始位置和长度。
string ret;
int n = s.size();
int m = t.size();
if (n < m)
return ret;
unordered_map<char, int> mp_t; // 统计t字符串中字符的出现次数
unordered_map<char, int> mp_s; // 统计窗口中字符的出现次数
for (auto e : t) mp_t[e]++;
int judge = mp_t.size();
int len = 0, beg = 0;
for (int l = 0, r = 0, count = 0; r < n; ++r) // count标记有效字符的种类
{
// 进窗口 + 维护count
mp_s[s[r]]++;
if (mp_s[s[r]] == mp_t[s[r]]) count++;
// 判断
while (count == judge)
{
// 更新结果
int prev = len;
len = len == 0 ? (r - l + 1) : min(len, r - l + 1);
if (len != prev) beg = l;
// 出窗口
if (mp_s[s[l]] == mp_t[s[l]]) count--;
mp_s[s[l++]]--;
}
}
return s.substr(beg, len);
热门推荐
右后背疼?当心这三种病在作祟!
北京房山附近五大令人惊叹的著名景点,你都知道几处?附游玩攻略
周口店遗址博物馆:探寻“北京人”的发源地
离婚协议书中探视权的安排与协商
北京国际鲜花港花灯庙会:春节打卡胜地
2024北京国际鲜花港冬季嘉年华:40组花灯点亮京城夜空
2025北京国际鲜花港花灯艺术节:40余组特色花灯点亮京城夜空
剩菜千万别这样存,看完转给咱爸妈→
绿茶和咖啡,哪个对身体更好?
香港租车攻略:价格、公司推荐及租车流程全解析
满洲里:打造国内一流综合枢纽口岸
千年古城墙见证衢州历史变迁
浙江沿海自驾游:如何应对台风季?
东钱湖自驾游:拍出美照的实用攻略
赤坎古镇文旅项目正式开业,打造广东文旅新地标
端午打卡赤坎古镇:骑楼、碉楼与图书馆里的侨乡记忆
王家卫镜头下的赤坎古镇:一座天然的影视摄影棚
阳朔摄影攻略:相公山、老寨山、黄姚古镇三大摄影圣地详解
探访青州古城:2024中国百强县市的魅力
国庆打卡青州仰天山:绝美盘山公路等你探索!
青州古城新玩法:一日游攻略大揭秘!
国庆节长假出行饮食健康应该注意什么?
钟南山团队证实:白云山板蓝根可提升免疫力
心脑血管老人吃什么饮食好
外滩绝美打卡点全攻略:5个必去机位+冬季拍摄技巧
北外滩:上海夏日避暑新去处,免费打卡点+室内活动全攻略
盐酸氟桂利嗪:偏头痛患者的福音?
浙江新交规上线,自驾游需注意这些变化!
Lonely Planet推荐:浙东海岸线自驾游攻略
杭州西溪国家湿地公园:冬日里的宁静与诗意,四日游攻略详解