class Solution {
public:
string minWindow(string s, string t) {
if(t.length() > s.length())
return "";
//初始化哈希表:记录t中字符出现个数
int cntT = t.length();
unordered_map<char, int> need;
for(char c : t){
need[c]++;
}
int left = 0; //当前窗口的起始位置
int minLen = INT_MAX; //最小窗口的长度
int start = 0; //最小窗口的起始位置
for(int right = 0; right < s.length(); right++){
//窗口右扩
if(need[s[right]] > 0){
cntT--;
}
need[s[right]]--;
//已囊括所有元素,开始缩减窗口
while(cntT == 0){
//更新结果
if(right - left + 1 < minLen){
minLen = right - left + 1;
start = left;
}
//缩减左边界
左边界为多余元素
if(need[s[left]] < 0){
need[s[left]]++;
}
else{//若左边界必须有,不能缩减窗口
need[s[left]]++;
cntT++;
}
left++;
}
}
return minLen == INT_MAX? "" : s.substr(start, minLen);
}
};