#include <climits>
#include <unordered_map>
class Solution {
public:
/**
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
string minWindow(string S, string T) {
// 可变滑动窗口
unordered_map<char, int> window, need;
// 目标
for (char& c : T) {
++need[c];
}
// start 和 len 记录答案
int start = 0, len = INT_MAX;
int left = 0, right = 0;
// 记录有效字符数
int valid = 0;
while (right < S.length()) {
char cur = S[right];
++right;
// need不含有的字符,我们可以忽略
// 如果need含有该字符,那我们需要更新window和valid
if (need.count(cur)) {
++window[cur];
if (window[cur] == need[cur]) ++valid;
}
// 在满足valid的条件下,循环判断最小的覆盖子串
while (valid == need.size()) {
if (right - left < len) {
len = right - left;
start = left;
}
char p = S[left];
++left;
// 不管是right加入还是left删除
// 同样的,只有need含有该字符时,我们去更新window窗口
if (need.count(p)) {
// 删除前判断
if (window[p] == need[p]) --valid;
--window[p];
}
}
}
return len == INT_MAX ? "" : S.substr(start, len);
}
};