算法题——无重复字符的最长子串

45 阅读1分钟

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

示例 1:

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

示例 2:

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

示例 3:

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

题解:滑动窗口

滑动窗口的核心思想

  • 用两个指针(leftright)表示一个“窗口”,窗口里的字符串始终保持 无重复字符
  • 初始时,left = right = 0
  • 每次把 right 往右移,看新字符是否能放进窗口:
    • 如果没有重复 → 加进窗口,更新最大长度。
    • 如果有重复 → 把 left 往右移动,直到窗口里不再有重复。

这样整个字符串只需要扫描一遍,复杂度 O(n)。

var lengthOfLongestSubstring = function(strs) {
    const set=new Set()
    let left=0,maxLen=0

    for(let right=0;right<strs.length;right++){
        while(left<right){
            if(strs.has(strs[right)){
              strs.delete(str[left])
              left++
            }
            
        }
        strs.add(strs[right])
        maxLen=Math.max(maxLen,right-left+1)
    }
    return maxLen
};
``