无重复字符的最长子串
Version 1
思路
- 使用队列deque来实现滑动窗口
Code
python
from collections import deque
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) <= 1:
return len(s)
queue = deque()
max_length = float('-inf')
left = 0
for right in range(len(s)):
cur_str = s[right]
if cur_str not in queue:
queue.append(cur_str)
else:
while cur_str in queue: ### 收缩窗口
queue.popleft()
left += 1
queue.append(cur_str)
max_length = max(max_length, right - left + 1) ## 计算没重复的最长字符串长度
return max_length
Version 2
思路
- 使用Set进行O(1)级别的查询以优化收缩窗口的判断实现
Code
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) <= 1:
return len(s)
### V2
hash_set = set()
max_length = float('-inf')
left = 0
for right in range(len(s)):
cur_str = s[right]
if cur_str not in hash_set:
hash_set.add(cur_str)
else:
while cur_str in hash_set: ### 收缩窗口
pre_str = s[left]
hash_set.remove(pre_str)
left += 1 ### 去掉重复的字母后向右移一位
hash_set.add(cur_str)
max_length = max(max_length, right - left + 1) ## 计算没重复的最长字符串长度
return max_length
Version 3
思路
- 字符串本身也快速实现判断一个 子字符串 在 原字符串 中
Code
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s) <= 1:
return len(s)
max_str = ""
max_length = float('-inf')
left = 0
for right in range(len(s)):
cur_str = s[right]
if cur_str not in max_str:
max_str += cur_str
else:
while cur_str in max_str: ### 收缩窗口
max_str = max_str[1:] ### 从左到右逐渐去掉字符
left += 1 ### 去掉重复的字母后向右移一位
max_str += cur_str
max_length = max(max_length, right - left + 1) ## 计算没重复的最长字符串长度
return max_length