class Solution {
public:
string minWindow(string s, string t) {
map required;
map exist;
for(int i = 0; i < (int) t.size(); i++) {
required[t[i]]++;
exist[t[i]] = true;
}
int valid_substring = (int) exist.size();
int j = 0;
int min_length = 1e9;
int S, E;
for(int i = 0; i < (int) s.size(); i++) {
while(valid_substring > 0 and j < (int) s.size()) {
if(exist[s[j]]) {
required[s[j]]--;
if(required[s[j]] == 0) {
valid_substring--;
}
}
j++;
}
if(valid_substring == 0) {
if(min_length > j - i + 1) {
min_length = j - i + 1;
S = i;
E = j;
}
}
if(exist[s[i]]) {
required[s[i]]++;
if(required[s[i]] > 0) {
valid_substring++;
}
}
}
if(min_length == 1e9) {
return "";
}
string res = "";
for(int i = S; i < E; i++) {
res += s[i];
}
if(min_length == 1e9) {
return "";
}
return res;
}
};