无重复字符的最长子串-LeetCode
3. 无重复字符的最长子串
🎯 问题描述(来源于LeetCode)
描述:
给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。
说明:
-
子串:字符串中一段连续非空的字符序列。
-
核心逻辑:使用滑动窗口维护一个“无重复字符”的区间。当遇到重复字符时,收缩左边界,直到窗口内再次满足无重复条件。
-
示例:
-
示例 1:
1 | 输入: s = "abcabcbb" |
- 示例 2:
1 | 输入: s = "bbbbb" |
- 示例 3:
1 | 输入: s = "pwwkew" |
💻 解题思路
思路1:不定长滑动窗口
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是字符串
s的长度。 - 虽然代码中有一个
while循环嵌套在for循环中,但每个字符最多被访问两次(一次被右边界right加入,一次被左边界left移出)。因此,整体操作次数是线性的。
- 其中 是字符串
- 空间复杂度:
- 其中 是字符集的大小(例如 ASCII 字符集大小为 128)。
- 哈希表
cnt最多存储 个字符的计数。如果字符集很大,则受限于字符串长度 。
思考
-
不定长窗口:
- 与之前的定长窗口不同,这里的窗口大小是动态变化的。
- 右边界
right始终向右移动。 - 左边界
left只有在遇到重复字符(cnt[c] > 1)时才会向右移动。
-
收缩逻辑:
while cnt[c] > 1:是核心。它保证了在任何时刻,窗口内的所有字符出现次数都不超过 1。- 当发现重复字符
c时,我们不断移除左边的字符,直到那个重复的c被移除一个为止。
-
答案更新时机:
ans = max(ans, right - left + 1)放在while循环之后。- 这保证了我们只在窗口满足“无重复字符”这一合法条件时,才去更新最大长度。
-
Counter 的使用:
- 使用
collections.Counter可以方便地处理字符计数,比普通的字典操作更简洁(例如不需要判断键是否存在)。
- 使用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






