题意:
        给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。




方法:
双指针

思路:
        初始化两个计数  map。
        首先,遍历字符串 t 进行计数统计,得到 mp2 ;
        然后,利用双指针遍历字符串 s :
                1.初始化 左右指针; 
                2.先循环右指针统计字符(累加字符),得到 mp1 ,当遍历达到 mp2是mp1的子集时,说明已达到区间的右端点;
                3.再循环左指针统计字符(累减字符),尽可能缩小字符串的长度来达到区间的左端点;
                4.计算该区间的长度,并且维护长度的最大值。



class Solution {
public:
    
    unordered_map<char,int> mp1,mp2;//两个计数数组
    
    int check(){// 判断mp1所有的字符个数都大于等于mp2中的
        for(auto x:mp2){
            if(mp1[x.first]<mp2[x.first]){
                return 0;
            }
        }
        return 1;
    }

    string minWindow(string S, string T) {
        
        for(int i=0;i<T.size();i++){//遍历字符串T,统计字符
            mp2[T[i]]++;
        }

        int i=0,j=0,n=S.size();//双指针
        string res;
        int mi=1e9;
        while(j<n){

            if(mp2.count(S[j])){//存在该字符,则计数
                mp1[S[j]]++;
            }
            while(check()){//区间的右端点满足,缩小左端点
                int t=j-i+1;
                if(mi>t){
                    mi=t;
                    res=S.substr(i,t);
                }
                mp1[S[i]]--;
                i++;
            }
            j++;
        }
        return res;
    }
};


时间复杂度:
空间复杂度: