最小覆盖子串问题:滑动窗口的优雅实现与深度剖析
一、问题核心与挑战
给定两个字符串 s
和 t
,要求从 s
中找到包含 t
所有字符(包括重复字符)的最短连续子串。若不存在,返回空字符串。例如:
s = "ADOBECODEBANC"
,t = "ABC"
→ 输出"BANC"
(最小窗口)s = "a"
,t = "aa"
→ 输出""
(无法满足重复需求)
挑战:如何高效地在一次遍历中找到最短覆盖子串?
二、代码实现与注释
以下代码通过滑动窗口算法实现,逐行解析其逻辑:
class Solution {
public:
string minWindow(string s, string t) {
vector<bool>Valid(128,false);//记录哪些字符是有效的(t中出现的)
vector<int>Freq(128,0);//记录t中某字符出现了多少次
for(char c : t)
{
Valid[c]=true;
Freq[c]++;
}
int l=0,min_l