Categories
interview

Minimum Window Substring

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
  if (s.length < t.length) {
    return '';
  }

  const sMap = Array(256).fill(0);
  const tMap = Array(256).fill(0);
  for (const c of t) {
    tMap[c.charCodeAt(0)]++;
  }
  let count = 0;
  let start = 0;
  let minStart = -1;
  let min = s.length;
  for (let j = 0; j < s.length; j++) {
    const c = s[j].charCodeAt(0);
    sMap[c]++;
    if (sMap[c] <= tMap[c]) {
      count++;
    }

    if (count === t.length) {
      // Minimize the window by moving the start pointer.
      while (sMap[s[start].charCodeAt(0)] > tMap[s[start].charCodeAt(0)]) {
        sMap[s[start].charCodeAt(0)]--;
        start++;
      }
      const currLen = j - start + 1;
      if (currLen < min) {
        min = currLen;
        minStart = start;
      }
    }
  }
  if (minStart === -1 && count !== t.length) {
    return '';
  }
  return minStart !== -1 ? s.substring(minStart, minStart + min) : s;
};

console.log(minWindow('ABCDFEDFI', 'DF'));
// DF

Demo