滑动窗口,蛮不错的一个方法

记录下来,可能会用到的

class Solution {
public:
    /**
     * 
     * @param S string字符串 
     * @param T string字符串 
     * @return string字符串
     */
string minWindow(string S, string T) {
    int left = 0, right = 0;
    int start = 0, minlen = INT_MAX;
    unordered_map<char, int> need;
    unordered_map<char, int> windows;

    for(auto i : T) need[i]++;
    int match = 0;

    while(right < S.length()) {
        char k = S[right];
        //元素S[i]在need数组中存在
        if(need.count(k)) {
            // windows[k]先++
            windows[k]++;
            // 这是考虑到同一个字符元素可能用多个的情况,例如T中有两个a
            if(windows[k] == need[k]) match++;
        }
        right++;
        while(match == need.size()) {
            if(right - left < minlen){
                minlen = right - left;
                start = left;
            }
            char m = S[left];
            if(need.count(m)) {
                windows[m]--;
                if(windows[m] < need[m]) match--;
            }
            left++;
        }

    }
    return minlen == INT_MAX ? "" : S.substr(start, minlen);
}
};