/*
 * @lc app=leetcode.cn id=76 lang=javascript
 *
 * [76] 最小覆盖子串
 */

// @lc code=start
/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function (s, t) {
  let ans = ''
  let left = 0;
  let winMap = new Map()

  let targetMap = new Map()
  for (let i = 0; i < t.length; i++) {
    targetMap.set(t[i], (targetMap.get(t[i]) || 0) + 1)
  }
  for (let right = 0; right < s.length; right++) {
    winMap.set(s[right], (winMap.get(s[right]) || 0) + 1);
    while (isCover()) {
      const tempStr = s.slice(left, right + 1);
      ans = ans === '' ? tempStr : tempStr.length > ans.length ? ans : tempStr;
      const leftVal = winMap.get(s[left])
      if (leftVal > 1) {
        winMap.set(s[left], leftVal - 1)
      } else {
        winMap.delete(s[left])
      }
      left++
    }
  }
  return ans;

  function isCover() {
    for (let k of targetMap.keys()) {
      if (!winMap.has(k) || winMap.get(k) < targetMap.get(k)) return false
    }
    return true
  }
};
// @lc code=end

console.log(minWindow("ADOBECODEBANC", "ABC"))
console.log(minWindow("a", "aa"))
console.log(minWindow("cabwefgewcwaefgcf", "cae"))