给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 提示: 0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成
时间: 2024-01-24 20:19:05 浏览: 60
这是一道经典的字符串题目,可以使用滑动窗口算法来解决。
具体思路如下:
1. 定义两个指针 left 和 right,分别指向子串的左右两端。
2. 构建一个哈希表,用于记录每个字符在子串中出现的次数。
3. 每次移动右指针时,将右指针所指向的字符出现次数加 1,如果该字符出现次数大于 1,则说明出现了重复字符,需要移动左指针,直到重复字符被移除为止。
4. 每次移动左指针时,将左指针所指向的字符出现次数减 1。
5. 记录每次移动后的子串长度,并更新最长子串长度。
6. 重复上述步骤,直到右指针到达字符串末尾。
下面是代码实现:
```python
def lengthOfLongestSubstring(s: str) -> int:
left, right = 0, 0 # 定义左右指针
max_len = 0 # 最长子串长度
char_dict = {} # 字符出现次数哈希表
while right < len(s):
# 右指针所指向的字符出现次数加 1
if s[right] not in char_dict:
char_dict[s[right]] = 1
else:
char_dict[s[right]] += 1
# 如果出现了重复字符,移动左指针,直到重复字符被移除为止
while char_dict[s[right]] > 1:
char_dict[s[left]] -= 1
left += 1
# 记录每次移动后的子串长度,并更新最长子串长度
max_len = max(max_len, right - left + 1)
# 移动右指针
right += 1
return max_len
```
时间复杂度为 O(n),空间复杂度为 O(k),其中 k 为字符集大小。
阅读全文