class Solution {
private:
unordered_map<char, int> need, window;
public:
string minWindow(string s, string t) {
for (char c : t) need[c]++;
int left = 0, right = 0, valid = 0;
int start = 0, len = INT_MAX;
while (right < s.size())
{
//c是将移入窗口的字符
char c = s[right++];
//如果t里面有c这个字符
if (need.count(c))
{
window[c]++;
if (window[c] == need[c])
valid++;
}
//如果窗口里已经包含所有需要的字符,要开始收缩
while (valid == need.size())
{
if (right - left < len)
{
start = left;
len = right - left;
}
char d = s[left];
left++;
//d是将移出的字符
if (need.count(d))
{
if (window[d] == need[d])
valid--;
window[d]--;
}
}
}
return len == INT_MAX ? "" : s.substr(start, len);
}
};