class Solution {
public:
//check方法,mp存放的是t字符串的hash值,我们遍历mp1如果mp1[i.first]>=i.second
//就让cont++,最后只要判断cont与mp的大小既可以
bool check(unordered_map<char,int>& mp,unordered_map<char,int>& mp1)
{
int cont=0;
for(auto i:mp) if(mp1[i.first] >= i.second) cont++;
if(cont == mp.size()) return true;
return false;
}
string minWindow(string s, string t) {
if(s.size() == 0) return "";
unordered_map<char,int> mp;
for(int i=0;i<t.size();i++) mp[t[i]]++;
int l=0;
int r=0;
int n=s.size();
unordered_map<char,int> mp1;
int st=0;
int len=n+10;
int fg=0;
while(1)//不能写成 r<n 原因:当r为n时,l还可以继续往右边移动
{
while(r<n && !check(mp,mp1))
{
if(mp.count(s[r])) mp1[s[r]]++;
r++;
}
if(r==n&&!fg&&!check(mp,mp1)) return "";//注意fg的标记
if(r-l < len)
{
fg=1;
st=l;
len=r-l;
}
if(mp1[s[l]]) mp1[s[l]]--;
l++;
if(r==n&&!check(mp,mp1)) break;//这一步是当r==n的情况下l右移时,当不符合check时
//跳出循环
}
return s.substr(st,len);
}
};