目录
前言
这次学习的是不定长滑动窗口,不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,以及求子数组个数。
一、例题一:无重复字符的最长子串
1.题目重述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
2.题目分析
本问是再字符串s里面找到一个不含重复字符的最长字串,求字串的长度。
3.建立模型求解
定义left和right两个指针,两个都是从0开始,然后right先依次加一从左往右便利每一个字符,当字串中出现了相同的字符,则left开始依次加一,将最左端的字符移除框中,直到字串中没有相同字符,重复上面操作。同时更新最长的字串。
4.代码求解
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
ans = 0
cnt = Counter()
left = 0 #定义字符出现的次数cnt和左指针
for right , x in enumerate():
cnt[x] += 1
whlie cnt[x] > 1:
cnt[s[left]] -= 1
left += 1 #当一个字符出现的次数cnt大于一时,从框的最左边开始移除元素,缩小框
ans = max(ans , right - left + 1) #更新最大的字串长度
return ans
二、例题二: 每个字符最多出现两次的最长子字符串
1.题目重述
给你一个字符串 s
,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。
示例 1:
输入: s = "bcbbbcba"
输出: 4
解释:以下子字符串长度为 4,并且每个字符最多出现两次:"bcbbbcba"
。
2.题目分析
本问相较于第一问,多了一个条件,就是字符最多可以出现两次。
3.建立模型求解
同上
4.代码求解
class Solution:
def maximumLengthSubstring(self, s: str) -> int:
ans = 0
cnt = Counter()
left = 0
for right , x in enumerate (s):
cnt[x] += 1
while cnt[x]>2
cnt[s[left]] -= 1
left += 1
ans = max (ans , right - left + 1)
return ans
二、例题三:删掉一个元素以后全为 1 的最长子数组
1.题目重述
给你一个二进制数组 nums
,你需要从中删掉一个元素。请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。如果不存在这样的子数组,请返回 0 。
提示 1:
输入:nums = [1,1,0,1] 输出:3 解释:删掉位置 2 的数后,[1,1,1] 包含 3 个 1 。
2.题目分析
就是用一个框,框中只能有一个0,且1的数目最多
3.建立模型求解
同上
4.代码求解
class Solution:
def longestSubarray(self, nums: List[int]) -> int:
ans = 0
cnt = Counter ()
left = 0
for right , x in enumerate(nums)
cnt[x] += 1
while cnt[0] > 1:
cnt[x[left]] -= 1
left += 1
if cnt[0] == 1
ans = max(ans,cnt[1]-1)
if cnt[0] == 0
ans = max(ans,cnt[1])
return ans
总结
这类题目都比较类似,关键是运用好cnt和左右指针