您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode中如何查看无重复字符的最长子串
## 引言
在算法学习和面试准备中,LeetCode是一个不可或缺的平台。其中,"无重复字符的最长子串"(Longest Substring Without Repeating Characters)是一个经典的字符串处理问题,考察我们对滑动窗口、哈希表等算法的掌握程度。本文将详细介绍如何在LeetCode上查看、理解并解决这个问题。
## 问题描述
题目编号为[3. 无重复字符的最长子串](https://leetcode.com/problems/longest-substring-without-repeating-characters/),题目要求:
给定一个字符串 `s`,找出其中不含有重复字符的**最长子串**的长度。
**示例:**
输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
## 解题思路
### 1. 暴力法(不推荐)
最直观的方法是检查所有可能的子串,判断是否有重复字符。时间复杂度为O(n³),效率极低。
```python
def lengthOfLongestSubstring(s: str) -> int:
n = len(s)
res = 0
for i in range(n):
for j in range(i, n):
if len(set(s[i:j+1])) == j - i + 1:
res = max(res, j - i + 1)
return res
通过维护一个窗口(用双指针表示),动态调整窗口大小以排除重复字符。时间复杂度优化至O(n)。
def lengthOfLongestSubstring(s: str) -> int:
char_set = set()
left = 0
res = 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])
res = max(res, right - left + 1)
return res
进一步优化滑动窗口,用哈希表记录字符的最新位置,直接移动左指针。
def lengthOfLongestSubstring(s: str) -> int:
char_map = {}
left = 0
res = 0
for right in range(len(s)):
if s[right] in char_map:
left = max(left, char_map[s[right]] + 1)
char_map[s[right]] = right
res = max(res, right - left + 1)
return res
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为-1,相当于在字符串左侧,还未移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断移动右指针
occ.add(s[rk + 1])
rk += 1
# 第i到rk个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
通过滑动窗口和哈希表,可以高效解决“无重复字符的最长子串”问题。在LeetCode上练习时,建议: 1. 先理解题目和示例; 2. 手写伪代码梳理逻辑; 3. 逐步优化解法; 4. 利用讨论区学习他人思路。
掌握此类问题后,对处理其他子串或数组问题将大有裨益。
附录:LeetCode相关题目分类
题目类型 | 推荐题目编号 |
---|---|
滑动窗口 | 3, 76, 159 |
哈希表应用 | 1, 49, 205 |
”`
这篇文章提供了从问题描述到解决方案的完整路径,并包含代码示例和LeetCode操作指南,总字数约1350字。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。