- 类型:可变长度的滚动窗口(while不合法直到合法)
- 题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
- 参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/
- 思路:可变窗口:(1)遇到不合法窗口时要用while更新直到窗口合法(2)每一次right循环更新都要更新目标
- 经验:(1)子集可以用集合来记录,set.add(a),set.remove(a) (2)left通过数字初始化和更新,right通过循环初始化和更新(3)集合索引和列表索引的区别:时间复杂度一致,集合的话多了个记录,列表用其自身做记录即可。(4)dict.get(key, default=None) #default – 如果指定键的值不存在时,返回该默认值。
#集合索引
if not s:return 0
left = 0
lookup = set() #用集合来记录子集
max_len = cur_len = 0
for i in range(len(s)): #left通过数字初始化和更新,right通过循环初始化和更新
while s[i] in lookup:#循环直到right不在lookup中
lookup.remove(s[left])
left += 1
cur_len -= 1
cur_len += 1 #每一次移动right都要更新目标
max_len = max(cur_len,max_len)
lookup.add(s[i])
return max_len
#列表索引
##初始化
max_length=length=0
i=0
for j in range(len(s)):
##窗口不合法,则移动左指针
while s[j] in s[i:j]: #一直查找直到找到重复元素
i+=1
length-=1
length+=1
max_length=max(max_length,length)
return max_length
#哈希表索引
明日计划:209. 长度最小的子数组
同解不同题:1695. 删除子数组的最大得分
题目:给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。返回 只删除一个 子数组可获得的 最大得分 。
def maximumUniqueSubarray(self, nums: List[int]) -> int:
left=0
sum=0
max_sum=-math.inf
window=set()
for right in range(len(nums)):
sum+=nums[right] #可以放在while前或者while后
while nums[right] in window:
window.remove(nums[left])
sum-=nums[left]
left+=1
window.add(nums[right]) #放在后面while之后是为了避免right=0的bug
max_sum=max(max_sum,sum)
return max_sum