#最长子串 滑动窗口
#给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长
# # Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表)
# x, y = ..., ...
#
# # Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
# start = 0
# for end in range(len(s)):
# # Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度)
# x = new_x
# if condition:
# y = new_y
#
# '''
# ------------- 下面是两种情况,读者请根据题意二选1 -------------
# '''
# # Step 4 - 情况1
# # 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度
# # 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变,
# # 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量
# if 窗口长度达到了限定长度:
# # 更新 (部分或所有) 维护变量
# # 窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变
#
# # Step 4 - 情况2
# # 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题
# # 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法
# # 在左指针移动之前更新Step 1定义的(部分或所有)维护变量
# while 不合法:
# # 更新 (部分或所有) 维护变量
# # 不断移动窗口左指针直到窗口再次合法
#
# # Step 5: 返回答案
# return ...
class Solution:
def lengthOfLongestSubstring(self, s):
maxlen= 0
hashmap = {}
start = 0
for end in range(len(s)):
hashmap[s[end]]= hashmap.get(s[end],0)+1
if end- start+1 == len(hashmap):
maxlen= max(maxlen, end-start+1)
while end-start+1 >maxlen:
head = s[start]
hashmap[head]= hashmap.get(head) -1
if hashmap[head] ==0:
del hashmap[head]
start +=1
return maxlen
[leetcode]3最长子串 滑动窗口
最新推荐文章于 2024-02-04 12:28:08 发布