导航菜单

无重复字符的最长子串

🟡 中等

题目描述

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

示例 1

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

示例 2

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

示例 3

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

提示

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

解法

参考答案 (3 个标签)
滑动窗口 哈希表 O(n)

思路

使用滑动窗口维护一个无重复字符的子串。用哈希表记录每个字符最后出现的位置,当遇到重复字符时,移动窗口左边界。

代码实现

/**
 * @param {string} s
 * @return {number}
 */
function lengthOfLongestSubstring(s) {
    const charIndex = new Map();
    let maxLen = 0;
    let left = 0;
    
    for (let right = 0; right < s.length; right++) {
        const char = s[right];
        
        if (charIndex.has(char) && charIndex.get(char) >= left) {
            left = charIndex.get(char) + 1;
        }
        
        charIndex.set(char, right);
        maxLen = Math.max(maxLen, right - left + 1);
    }
    
    return maxLen;
}

复杂度分析

  • 时间复杂度:O(n),每个字符最多被访问两次
  • 空间复杂度:O(min(m, n)),m 为字符集大小

图解

s = "abcabcbb"

步骤 1: [a]bcabcbb  left=0, right=0, maxLen=1
步骤 2: [a b]cabcbb  left=0, right=1, maxLen=2
步骤 3: [a b c]abcbb left=0, right=2, maxLen=3
步骤 4: a[b c a]bcbb left=1, right=3, maxLen=3 (遇到重复的 a)
步骤 5: a b[c a b]cbb left=2, right=4, maxLen=3 (遇到重复的 b)
...

搜索