栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【算法训练】滑动窗口 leetcode python解法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法训练】滑动窗口 leetcode python解法

一、最小覆盖子串 76

https://leetcode-cn.com/problems/minimum-window-substring/submissions/

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

1、分析

浅浅分析一下,我们需要找到s字符串中的一个子串,该子串能够包含t中的字符,而且字符的数量要和t中相应字符的数量一样。
我们先用字典统计出t中所有字符以及对应的数量,然后采用滑动窗口去记录访问到的s子串的相应字符数量。用valid标记t中字符出现次数满足条件的情况,若valid与t中字符数相等了,说明t中每个字符都在当前子串中出现了,而且这些字符的数量都是大于等于他们在t中的数量的。
此时就应该进行窗口的缩小了,在窗口缩小的过程中,不断更新子串的起始索引和长度,方便结果的返回。

具体可以看代码和注释。

2、代码
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        need = Counter(t) #统计t中所有字符的数量
        window = collections.defaultdict(int)  #初始化滑动窗口
        valid = 0 #记录满足条件的字符数
        start,min_len = 0,float('inf') #记录最小子串的起始索引和长度
        left,right = 0,0 #滑动窗口的边界
        while right 
二、字符串的排列 567 

https://leetcode-cn.com/problems/permutation-in-string/

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

1、分析

与第一题的模板一样,只是在缩小窗口的循环控制条件处,以及valid判断处有不同。具体可以看代码及注释。

2、代码
class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        need = Counter(s1)
        window = collections.defaultdict(int)
        left,right = 0,0
        valid = 0
        while right 
三、找到字符串中所有字母异位词 438 

https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

1、分析

这道题与第二道题非常相似,只是第二题找到一个就行,这道题需要找到所有满足条件的子串。具体见代码。

2、代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        res = []
        need = Counter(p)
        window = collections.defaultdict(int)
        left,right = 0,0
        valid = 0
        while right 
四、无重复字符的最长子串 

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/submissions/

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

1、分析

抓住两个要点,不含重复字符,以及要找到最长的子串。具体见代码。

2、代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        window = collections.defaultdict(int)
        left,right = 0,0
        res = 0
        while right1: 
                # 只要有重复元素,就缩小窗口大小
                d = s[left] 
                left += 1
                window[d] -= 1
            res = max(res,right-left)
        return res


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/844534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号