[leetcode 刷题] 滑动窗口相关题目总结

647 阅读2分钟

3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度:

示例:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

方法一:

思路

暴力且未超出时间限制的解法

代码

var lengthOfLongestSubstring = function (s) {
  if (s.length <= 1) {
    return s.length
  }
  let len = 0
  let currentStr = ''
  for (let i = 0; i < s.length; i++) {
    const start = s[i];
    currentStr += start
    for (let j = i + 1; j < s.length; j++) {
      const end = s[j];
      if (currentStr.indexOf(end) >= 0) {
        break
      } else {
        currentStr += end
      }
    }
    len = Math.max(currentStr.length, len)
    currentStr = ''
  }
  return len
};
// lengthOfLongestSubstring('pwwkew')
// lengthOfLongestSubstring('abcabcbb')
// lengthOfLongestSubstring(" ")
// lengthOfLongestSubstring("ax")
// lengthOfLongestSubstring("abba")
// lengthOfLongestSubstring("abcabcbb")
 

// 其实我们可以把每次搜索过的字符加入 Hash/Set 这样判断元素是否重复部分的时间复杂度可以降到 O(1)

// 实测并没有减少 runtime 反而比上面一种还要慢
var lengthOfLongestSubstring = function (s) {
  if (s.length <= 1) {
    return s.length
  }
  let len = 0
  let currentDict = {}
  for (let i = 0; i < s.length; i++) {
    const start = s[i];
    currentDict[start] = true
    for (let j = i + 1; j < s.length; j++) {
      const end = s[j];
      if (currentDict[end]) {
        break
      } else {
        currentDict[end] = true
      }
    }
    len = Math.max(Object.keys(currentDict).length, len)
    currentDict = {}
  }
  return len
};

方法二:

使用滑动窗口

左右指针同时指向第一个元素 b指针向右移动 判断右指针指向的元素是否出现在左右指针区间内 如果出现 左指针右移值出现位置的后一个位置 更新右指针和最大长度

代码

var lengthOfLongestSubstring = function(s) {
  if (s.length <= 1) return s.length;
  let ans = 0,
    map = new Map();
  for (let end = 0, start = 0; end < s.length; end++) {
    const el = s[end];
    if (map.has(el)) start = Math.max(start, map.get(el) + 1);
    map.set(el, end);
    ans = Math.max(ans, end - start + 1);
  }
  return ans;
}

解法引自 这里