leetcode算法-3-无重复字符的最长子串

159 阅读2分钟

问题描述

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

示例 1:

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

示例 2:

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

示例 3:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

求解

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  var str = ''
  var size = 0
  for (var i = 0, len = s.length; i < len; i++) {
    var char = s.charAt(i)
    var index = str.indexOf(char)
    if (index == -1) {
      str += char
      size = Math.max(str.length, size)
    } else {
      str = str.substr(index + 1) + char
    }
  }
  return size
};

此题使用滑动窗口算法

  • 设置一个对象
  • 使用左右两个指针,遍历字符串,判断对象中是否已包含字符,若不包含,则添加进对象,右指针+1
  • 对比当前无重复子串的长度和最大值,计算出新的最大值
  • 左指针右移,移除一个字符,继续先前的步骤
  • 在枚举结束后,找到的最长子串即是答案
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  const strs = new Set()
  const len = s.length
  let r = -1
  let max = 0
  for (let i = 0; i < len; i++) {
    if (i !== 0) {
      strs.delete(s.charAt(i - 1))
    }
    while (r + 1 < len && !strs.has(s.charAt(r + 1))) {
      strs.add(s.charAt(r + 1))
      r++
    }
    max = Math.max(max, r - i + 1)
  }
  return max
};

执行结果

执行用时 :96 ms, 在所有 JavaScript 提交中击败了82.30%的用户
内存消耗 :39.8 MB, 在所有 JavaScript 提交中击败了61.64%的用户
提交结果 执行用时 内存消耗
通过 96ms 39.8MB

更多前端资料请关注公众号 【三分钟热度工程师】

如果觉得写得还不错,可以关注gitbook小册

本文使用 mdnice 排版