给定一个字符串
s,请你找出其中不含有重复字符的 最长子串 的长度。
**示例1**
> **输入**:s = "abcabcbb"
> **输出**:3
> **解释**:因为无重复字符的最长子串是`"abc"`,所以其长度为3
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
提示:
- 0 <= s.length <= 5 * 10 4
s由英文字母、数字、符号和空格组成
代码
知识点:滑动窗口
def lengthOfLongestSubstring( s ) :
n = len(s)
'''
# 1.使用队列
i = 0 # 指向串首
j = 0 # 指向串尾巴
w = collections.deque() # 无重复子串窗口,使用队列
ans = 0
while j < n:
while w and s[j] in w:
w.popleft() # 不断删除第一个进队的直到窗口里子串不重复
i += 1
w.append(s[j])
ans = max(ans , j - i + 1) # 无重复,取值
j += 1 # 扩展窗口
return ans
'''
# 2. 使用hash表
i = 0
j = 0
d = set() # 使用hash表要快的多
ans = 0
while j < n:
while s[j] in d:
d.remove(s[i])
i += 1
d.add(s[j])
ans = max(ans , j - i + 1) # 无重复,取值
j += 1 # 扩展窗口
return ans