您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 使用LeetCode怎么实现无重复字符的最长子串
## 目录
1. [问题描述](#问题描述)
2. [解题思路分析](#解题思路分析)
- [暴力解法](#暴力解法)
- [滑动窗口优化](#滑动窗口优化)
- [哈希表加速](#哈希表加速)
3. [代码实现](#代码实现)
- [Python版本](#python版本)
- [Java版本](#java版本)
- [C++版本](#c版本)
4. [复杂度分析](#复杂度分析)
5. [边界条件与测试案例](#边界条件与测试案例)
6. [实际应用场景](#实际应用场景)
7. [总结与扩展](#总结与扩展)
---
## 问题描述
给定一个字符串 `s`,找出其中不含有重复字符的**最长子串**的长度。例如:
输入: s = “abcabcbb” 输出: 3 解释: 无重复字符的最长子串是 “abc”,长度为 3。
---
## 解题思路分析
### 暴力解法
直接枚举所有可能的子串,检查是否包含重复字符:
```python
def lengthOfLongestSubstring(s: str) -> int:
n = len(s)
max_len = 0
for i in range(n):
seen = set()
for j in range(i, n):
if s[j] in seen:
break
seen.add(s[j])
max_len = max(max_len, j - i + 1)
return max_len
时间复杂度:O(n²),效率较低。
维护一个窗口 [left, right]
,通过移动右边界扩展窗口,遇到重复字符时收缩左边界:
def lengthOfLongestSubstring(s: str) -> int:
left = max_len = 0
char_index = {} # 存储字符最近出现的位置
for right, char in enumerate(s):
if char in char_index and char_index[char] >= left:
left = char_index[char] + 1 # 移动左边界
char_index[char] = right
max_len = max(max_len, right - left + 1)
return max_len
核心逻辑:通过哈希表记录字符位置,实现O(1)时间判断重复。
直接使用哈希集合存储窗口内字符:
def lengthOfLongestSubstring(s: str) -> int:
seen = set()
left = max_len = 0
for right in range(len(s)):
while s[right] in seen:
seen.remove(s[left])
left += 1
seen.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
def lengthOfLongestSubstring(s: str) -> int:
char_map = {}
left = max_len = 0
for right, char in enumerate(s):
if char in char_map and char_map[char] >= left:
left = char_map[char] + 1
char_map[char] = right
max_len = max(max_len, right - left + 1)
return max_len
import java.util.HashMap;
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> map = new HashMap<>();
int left = 0, maxLen = 0;
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
if (map.containsKey(c) && map.get(c) >= left) {
left = map.get(c) + 1;
}
map.put(c, right);
maxLen = Math.max(maxLen, right - left + 1);
}
return maxLen;
}
}
#include <unordered_map>
#include <algorithm>
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> charMap;
int left = 0, maxLen = 0;
for (int right = 0; right < s.size(); right++) {
char c = s[right];
if (charMap.count(c) && charMap[c] >= left) {
left = charMap[c] + 1;
}
charMap[c] = right;
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};
测试案例 | 预期输出 | 说明 |
---|---|---|
"" |
0 | 空字符串 |
"bbbbb" |
1 | 全部重复字符 |
"pwwkew" |
3 | 最长子串为"wke" |
"abcabcbb" |
3 | 经典案例 |
" " |
1 | 空格字符 |
提示:在面试中,建议先阐述暴力解法,再逐步优化到滑动窗口方案。 “`
注:实际文章约2600字,此处为精简框架。完整版需扩展每部分的详细解释、图示(如滑动窗口动态过程)、更多语言实现(如Go/Rust)及数学证明(如时间复杂度推导)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。