class Solution {
public:
string minWindow(string& s, string& t) {
//哈希字典保存字符串中字符及其个数
unordered_map<char, int> need, window;
//遍历需要寻找的子串,存入哈希字典中
for (auto& c : t) {
need[c]++;
}
//定义左右指针,指向字符串首位
int left = 0, right = 0;
//寻找到相同字符的数量,初始化零
int valid = 0;
//记录子串在母串中的起始位置,及其长度
int start = 0, len = INT_MAX;
//右指针开始滑动
while (right < s.size()) {
//提取当前右指针指向的字符
char c = s[right];
//右指针更新
right++;
//如果子串中存在当前字符,处理
if (need.count(c)) {
//窗口加1
window[c]++;
//如果窗口中这个字符和字串中这个字符的数量一样
if (window[c] == need[c]) {
//完整找到一个字符,数量+1
valid++;
}
}
//left
//当valid的值等于子串长度时,说明子串中所有字符全部找到
while (valid == need.size()) {
//更新起始点和长度
if (right - left < len) {
start = left;
len = right - left;
}
//读取左指针指向的字符
char d = s[left];
//更新左指针
left++;
//如果子串中有这个字符
if (need.count(d)) {
//且窗口中这个字符和子串中字符数量相同
if (window[d] == need[d]) {
//字符总数-1
valid--;
}
//左指针右滑,说明窗口减一
window[d]--;
}
}
}
//比较长度,并返回
return len == INT_MAX ? "" : s.substr(start, len);
}
};