1. 题目
2. 解析
使用滑动窗口进行解法 模板:
def slidingWindow(s:str,t:str):
'''初始化 window 和 need 两个哈希表,记录窗口中的字符和需要凑齐的字符:'''
need, window = collections.defaultdict(int), collections.defaultdict(int) # {char:int}
for c in t:
need[c] += 1
left, right = 0, 0
valid = 0 # 表示窗口中满足need条件的字符个数,如果valid和len(need)的大小相同,则说明窗口已满足条件
'''使用 left 和 right 变量初始化窗口的两端,不要忘了,区间 [left, right) 是左闭右开的,所以初始情况下窗口没有包含任何元素:'''
while right < len(s):
# c是将要移入窗口的字符
c = s[right]
# 增大窗口
right += 1
# 进行窗口内数据的一系列更新
..."""更新窗口数据的地方"""
# 判断左侧窗口是否要收缩
while '''window needs shrink''':
# d是将要移出窗口的字符
d = s[left]
# 缩小窗口
left += 1
# 进行窗口内数据的一系列更新
..."""更新窗口数据的地方"""
3. 核心代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = 0
right = 0
windows = {}
res = 0
while right < len(s):
# 增大窗口
cur = s[right]
right += 1
# 根据cur往window-窗口里记录当前的元素
windows[cur] = windows.get(cur, 0) + 1
# 判断是否需要缩小窗口,这里的条件是,判断windows[cur]是否大于1
while windows[cur] > 1:
delete = s[left]
left += 1
windows[delete] -= 1
# 到这里,s[left: right]的结果里是不含有重复字符的
# 注意,这里的索引是左闭右开区间,[left, right)
res = max(res, right - left)
return res
if __name__ == '__main__':
s = Solution()
print(s.lengthOfLongestSubstring("pwwkew"))