• 這一題同樣是定長度的 sliding window,window size 為 s1.size()
class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        unordered_map<char,int> map, map2;
        int k = s1.size();
        int n = s2.size();
        if (k > n) return false;
        int valid = 0;
        for (const auto& c : s1) map[c]++;
        for (int i = 0; i < k; i++) {
            if (!map.count(s2[i])) continue;
            if (++map2[s2[i]] == map[s2[i]]) valid++;
        }
        if (valid == map.size()) return true;
        for (int i = k; i < n; i++) {
            if (map.count(s2[i]) && ++map2[s2[i]] == map[s2[i]]) valid++;
            if (map.count(s2[i-k]) && map2[s2[i-k]]-- == map[s2[i-k]]) valid--;
            if (valid == map.size()) return true;
        }
        return false;
    }
};