Skip to content

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

  • 题号:3
  • 来源:LeetCode
  • 难度:中等
  • 标签:滑动窗口 哈希表 字符串
  • 语言:TypeScript · Python · Java
  • 解法:3 个
  • 作者:lmliheng
  • 最近更新:2026-09-29

TypeScript ​

TypeScript · O(n) 时间 · O(n) 空间 · 更新于 2026-09-27

滑动窗口配计数表,重复时右移左边界

typescript
/**
 * @difficulty medium
 * @tags 滑动窗口,哈希表,字符串
 * @time O(n)
 * @space O(n)
 * @note 滑动窗口配计数表,重复时右移左边界
 * @
 * 滑动窗口
 * 
 */


/**
 * 
 * @滑动窗口-优解
 * 始终维护一个无重复子串
 * 先确定右边界,再压缩左边界,直到右边界抵达n-1
 * 抵达res=xxx这段时,已经就是一个无重复子串
 * 
 */
function lengthOfLongestSubstring(s: string) {
    let res = 0
    let map = new Map()
    let left = 0
    for (let i = 0; i < s.length; i++) {
        if (!map.has(s[i])) {
            map.set(s[i], 1)
        } else {
            map.set(s[i], map.get(s[i]) + 1)
        }

        while (map.get(s[i]) > 1) {
            map.set(s[left], map.get(s[left]) - 1)
            left++
        }
        res = Math.max(res, i - left + 1)

    }
    return res
};

源码:ts/leetcode/3.无重复字符的最长子串.ts

Python ​

Python · O(n) 时间 · O(n) 空间 · 更新于 2026-09-29

滑动窗口配字符计数,超 1 就左移

python
"""
@difficulty medium
@tags 滑动窗口,哈希表,字符串
@time O(n)
@space O(n)
@note 滑动窗口配字符计数,超 1 就左移
无重复字符的最长子串

lc 3
"""

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n=len(s)
        res=0
        left=0
        dict1={}
        for i in range(0,n):
            if s[i] in dict1:
                dict1[s[i]]+=1
            else:
                dict1[s[i]]=1
            while dict1[s[i]]>1:
                dict1[s[left]]-=1
                left+=1
            res=max(res,i-left+1)
        return res

源码:python/leetcode/hot100/8.py

Java ​

Java · O(n) 时间 · O(min(n, 字符集大小)) 空间 · 更新于 2026-09-27

滑动窗口配计数表,右指针字符计数超 1 就收缩左边界

java
/**
 * @lc 3
 * @title 无重复字符的最长子串
 * @difficulty medium
 * @tags 滑动窗口,哈希表,字符串
 * @time O(n)
 * @space O(min(n, 字符集大小))
 * @note 滑动窗口配计数表,右指针字符计数超 1 就收缩左边界
 */
public class LengthOfLongestSubstring {

    public int lengthOfLongestSubstring(String s) {
        int res = 0;
        int n = s.length();
        Map<Character, Integer> map = new HashMap<>();
        int left = 0;
        for (int i = 0; i < n; i++) {

            if (map.containsKey(s.charAt(i))) {
                map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
            } else {
                map.put(s.charAt(i), 1);
            }

            while (map.get(s.charAt(i)) > 1) {
                map.put(s.charAt(left), map.get(s.charAt(left)) - 1);
                left++;
            }
            res = Math.max(res, i - left + 1);
        }
        return res;
    }
}

源码:Java/src/main/java/com/algorithm/leetcode/LengthOfLongestSubstring.java


在 GitHub 上查看题目所在目录:lmliheng/algorithm