/** * @param {string} s * @param {string} t * @return {string} */ const minWindow = (s, t) => { let l = -1, r = -1, sChar = s.split(""), tChar = t.split(""), trackingMap = new Map(); tChar.forEach((item) => trackingMap.set(item, (trackingMap.get(item) || 0) + 1)); if (JSON.stringify(sChar) === JSON.stringify(tChar)) return s; // if the values of the map has a 0, skip saving the min - as we know that it’s not complete // let sCount = sChar.length; for (let i = 0; i < sChar.length; i++) { if (!tChar.includes(sChar[i])) continue; // esc // map in the loop, to keep the visit visitMap = new Map([...trackingMap]), // reset visit count every loop have = 1; visitMap.set(sChar[i], visitMap.get(sChar[i]) - 1); // reduce the curr node if (have === tChar.length) { l = i; r = i; break; } for (let k = i + 1; k < sChar.length; k++) { if (visitMap.has(sChar[k])) visitMap.set(sChar[k], visitMap.get(sChar[k]) - 1); if (0 <= visitMap.get(sChar[k])) have++; if (tChar.length === have && ((r == -1 && l == -1) || ((k - i + 1) < (r - l + 1)))) { l = i; r = k; break; } } } return sChar.slice(l, r + 1).join(''); }