题目难度
中等
题目描述
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
提示
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
解题思路
使用哈希表+双指针滑动窗口法
代码
def lengthOfLongestSubstring(self, s: str) -> int:
# 使用字典作为哈希表,记录每个字符是否出现过
subs=dict()
# 左指针初始指向-1,res为结果
l,res=-1,0
n=len(s)
for i in range(n):
# 遇到重复字符更新左指针,注意重复字符可能出现在左指针之前的情况
if s[i] in subs and subs[s[i]]>l:
l=subs[s[i]]
else:
res=max(res,i-l) # i-l为滑动窗口长度
subs[s[i]]=i
return res
复杂度分析
时间复杂度:O(N),其中 N 是字符串的长度。右指针i会遍历整个字符串一次。
空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [0,128) 内的字符,即∣Σ∣=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有 ∣Σ∣ 个,因此空间复杂度为 O(∣Σ∣)。