class Solution {
public:
string minWindow(string s, string t) {
//左闭右开区间,初始化中,没有元素
int left=0,right=0;
unordered_map<char,int>window,need;
int valid=0;
//start 满足t在s中的条件的起点,len 满足条件的字符串长度
//size()+1 是len永远不会到达的长度,用来作比较
int start=0,len=s.size()+1;
//将t字符放入c中
for(char c:t)
need[c]++;
//right 遍历直到s.size()-1 不然索引会越界
while(right<s.size())
{
char c=s[right];
//左闭右开的空间
//right指向下一个元素
right++;
if(need.count(c))
{
window[c]++;
if(window[c]==need[c])valid++;
}
//t字符串中的字符都找到了,开始缩小窗口,
while(valid==need.size())
{
//size()+1 是len永远不会到达的长度,用来作比较
//更新包含T所有字符的最小字串
if((right-left)<len)
{
start=left;
len=right-left;
}
char d=s[left];
//缩小窗口
left++;
//缩小窗口,需要更新数据
if(need.count(d))
{
//可能当前截取字串中,有重复的t中的字符,BBEAC ABC window中B的数量大于need中B的数量,j即window[d]>need[d]所以只有windwindow[d]--才能到window[d]==need[d]时才valid--
if(window[d]==need[d])
valid--;
window[d]--;
}
}
}
return len==(s.size()+1)?"":s.substr(start,len);
}
};