您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何返回不重复字符的最长字串长度
## 问题描述
给定一个字符串,找出其中不含有重复字符的**最长子串**的长度。例如:
- 输入 `"abcabcbb"`,输出 `3`(最长子串是 `"abc"`)
- 输入 `"bbbbb"`,输出 `1`(最长子串是 `"b"`)
- 输入 `"pwwkew"`,输出 `3`(最长子串是 `"wke"`)
## 解决方案
### 方法一:滑动窗口(双指针)
这是解决该问题的经典方法,时间复杂度为 O(n),空间复杂度为 O(min(m, n)),其中 m 是字符集大小。
#### 算法步骤
1. 初始化两个指针 `left` 和 `right`,表示当前窗口的左右边界。
2. 使用一个哈希集合(或字典)记录当前窗口中的字符。
3. 移动 `right` 指针,扩展窗口:
- 如果当前字符不在集合中,加入集合并更新最大长度。
- 如果字符已存在,移动 `left` 指针,直到重复字符被移除。
4. 重复直到 `right` 指针遍历完整个字符串。
#### Python 实现
```python
def length_of_longest_substring(s: str) -> int:
char_set = set()
left = 0
max_len = 0
for right in range(len(s)):
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
当发现重复字符时,可以直接将 left
指针跳到重复字符的下一个位置,而无需逐步移动。
left
到 max(left, 重复字符的下一个位置)
。def length_of_longest_substring(s: str) -> int:
char_index = {}
left = 0
max_len = 0
for right in range(len(s)):
if s[right] in char_index:
left = max(left, char_index[s[right]] + 1)
char_index[s[right]] = right
max_len = max(max_len, right - left + 1)
return max_len
如果字符集较小(如 ASCII 码),可以用固定大小的数组代替哈希表,进一步优化空间。
def length_of_longest_substring(s: str) -> int:
last_index = [-1] * 128 # ASCII 范围
left = 0
max_len = 0
for right in range(len(s)):
char = s[right]
left = max(left, last_index[ord(char)] + 1)
last_index[ord(char)] = right
max_len = max(max_len, right - left + 1)
return max_len
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
滑动窗口 | O(n) | O(min(m, n)) |
优化滑动窗口 | O(n) | O(min(m, n)) |
数组优化 | O(n) | O(m)(m 为字符集大小) |
""
→ 0
"aaaa"
→ 1
"abcd"
→ 4
"aababcbb"
→ 3
0
。通过滑动窗口及其优化版本,可以高效解决最长无重复子串问题。推荐优先使用优化滑动窗口(方法二),兼顾可读性与性能。对于已知字符集的问题(如纯ASCII),可尝试数组优化(方法三)以进一步提升效率。
”`
注:实际字数约为 950 字(含代码和格式标记)。如需调整内容细节,可进一步扩展算法原理或示例部分。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。