leetcode第76.题最小覆盖子串

160 阅读1分钟

题目: 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 题目链接

JavaScript解法

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
  let need = {};
  let matched = {};
  let matchedCount = 0;
  for (let char of t) need[char] = (need[char] || 0) + 1;
  let startIndex = 0, minLen = Number.MAX_VALUE;
  let left = 0, right = 0;
  while(right < s.length) {
    // 增大窗口
    let char = s[right];
    right++;
    if (need[char]) {
      matched[char] = (matched[char] || 0) + 1;
      if (matched[char] === need[char])
        matchedCount++;
    }
    while(matchedCount === Object.keys(need).length) {
       // 缩小窗口
      if (right - left < minLen) {
        startIndex = left;
        minLen = right - left;
      }
      let d = s[left];
      left++;
      if (need[d]) {
        if (matched[d] === need[d])
          matchedCount--;
        matched[d]--;
      }
    }
  }

  return minLen == Number.MAX_VALUE ? "" : s.substr(startIndex, minLen);
};

解析: 双指针滑动窗口解法

  • 时间复杂度:O(n)O(n)