S = "ADOBECODEBANC", T = "ABC";
function minWindow(s,t) {
let start = 0,end = 0, needMap = new Map(),match = 0,windowMap = new Map(),flag,tLen = t.length,sLen = s.length,minLen = sLen+1;
for(let i=0;i<tLen;i++){
let val = needMap.get(t[i]);
needMap.set(t[i],val ? ++val : 1);
}
while(end <= sLen){
let val = windowMap.get(s[end]) ? windowMap.get(s[end]) : 0;
windowMap.set(s[end],++val);
val === needMap.get(s[end]) ? match++ : '';
end++
while(match === needMap.size) {
let val = windowMap.get(s[end]);
if(end - start < minLen) {
minLen = end - start;
flag = start;
}
let valStart = windowMap.get(s[start]);
if(valStart > 0) {
valStart--;
windowMap.set(s[start],valStart);
needMap.get(s[start]) && valStart < needMap.get(s[start]) ? match-- : ''
}
start++
}
}
return flag >=0 ? s.substr(flag,minLen) : ''
}