classSolution {
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 (constauto& 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;
}
};