「前端刷题」3. 无重复字符的最长子串

341 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

题目

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

 

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = "" 输出: 0

 

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

解题思路

思路1

双指针+Set
定义一个区间,每次移动一下取间的起点或者重点。
移动区间之后改变当前包含的总字符Set集。
1.当end的值不在Set里,区间终点右移。
2.当end的值在Set里,区间起点右移,直到arr[start]==arr[end],结束右移,区间终点+1

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    if(s.length<=1)return s.length
    let arr = Array.from(s)
    let set = new Set()
    let start=0
    let end = 1
    let maxLen = 0
    set.add(arr[0])
    while(start<=end&&start<arr.length&&end<arr.length){
        if(!set.has(arr[end])){
            maxLen = Math.max(maxLen,end-start)
            set.add(arr[end])
            end++
        }else{
            while(start<end){
                const result = arr[end]==arr[start]
                if(result){
                    start++
                    end++
                    break
                }else{
                    set.delete(arr[start])//左边右移之后,将该位置移除字符集
                    start++
                }
            }
        }
    }
    return maxLen+1
};

思路2

执行用时:240 ms, 在所有 JavaScript 提交中击败了17.47%的用户
内存消耗:44.1 MB, 在所有 JavaScript 提交中击败了18.98%的用户
最拉解法

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  if(!s.length) return 0
  let res = 1
  for(let i = 0; i < s.length; i++){
      let a = new Set()
      r = i
      while(r < s.length&&!a.has(s[r])){
          a.add(s[r])
          r++
      }
      res = Math.max(res,a.size) 
  }
  return res
};

最后

曾梦想仗剑走天涯

看一看世界的繁华

年少的心总有些轻狂

终究不过是个普通人

无怨无悔我走我路

「前端刷题」No.3