<鲁不懂了>二:LeetCode刷题,滑动窗口(不定长)

目录

前言

一、例题一:无重复字符的最长子串

1.题目重述

2.题目分析

3.建立模型求解

4.代码求解

二、例题二: 每个字符最多出现两次的最长子字符串

1.题目重述

2.题目分析

3.建立模型求解

4.代码求解

二、例题三:删掉一个元素以后全为 1 的最长子数组

1.题目重述

2.题目分析

3.建立模型求解

4.代码求解

总结



前言

        这次学习的是不定长滑动窗口,不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,以及求子数组个数。


一、例题一:无重复字符的最长子串

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和左右指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁不动AI了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值