【LBLD】我写了首诗,把滑动窗口算法算法变成了默写题

发布时间 2023-04-12 20:46:25作者: 杨谖之

【LBLD】我写了首诗,把滑动窗口算法算法变成了默写题

76.最小覆盖子串

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char, int=""> need, window;
        for (char c : t) need[c]++;

        int left=0, right=0;
        int valid=0;
        int start=0, len=INT_MAX;
        while (right &lt; s.size()) {
            char c = s[right];
            right++;
            if (need.count(c)) {
                window[c]++;
                if (need[c] == window[c]) {
                    valid++;
                }
            }

            while (valid == need.size()) {
                if (right - left &lt; len) {
                    start = left;
                    len = right - left;
                }
                char d = s[left];
                left++;
                if (need.count(d)) {
                    if (window[d] == need[d]) {
                        valid--;
                    }
                    window[d]--;
                }
            }
        }
        return len == INT_MAX ? "" : s.substr(start, len);
    }
};

567. 字符串的排列

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        unordered_map<char, int=""> need, window;
        for(char c: s1) need[c]++;
        
        int left=0, right=0;
        int valid=0;
        while (right &lt; s2.size()) {
            char c = s2[right];
            right++;

            if (need.count(c)) {
                window[c]++;
                if (window[c] == need[c]) {
                    valid++;
                }
            }

            while (right - left &gt;= s1.size()) {
                if (valid == need.size()) {
                    return true;
                }

                char d = s2[left];
                left++;

                if (need.count(d)) {
                    if (window[d] == need[d]) {
                        valid--;
                    }
                    window[d]--;
                }
            }
        }
        return false;
    }
};

438. 找到字符串中所有字母异位词

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        unordered_map<int, int=""> need, window;
        for (char c: p) need[c]++;
        
        int left = 0, right = 0;
        vector<int> res;
        int valid = 0;
        while (right &lt; s.size()) {
            char c = s[right];
            right++;
            
            if (need.count(c)) {
                window[c]++;
                if (need[c] == window[c]) {
                    valid++;
                }
            }

            while (right - left &gt;= p.size()) {
                if (valid == need.size()) {
                    res.push_back(left);
                }

                char d = s[left];
                left++;

                if (need.count(d)) {
                    if (need[d] == window[d]) {
                        valid--;
                    }
                    window[d]--;
                }
            }
        }
        return res;
    }
};

3. 无重复字符的最长子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int=""> window;

        int left = 0, right = 0;
        int len = 0;
        while (right &lt; s.size()) {
            char c = s[right];
            right++;
            
            window[c]++;
            
            while (window[c] == 2) {
                if (len &lt; right - left - 1) len = right - left - 1;
                char d = s[left];
                left++;

                if (window.count(d)) {
                    window[d]--;
                }
            }
        }
        return len &gt; right - left ? len : right - left;
    }
};

</char,></int,></char,></char,>