【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】

一般应用场景

数组,字符串子串等问题。

通用模板

双指针大致逻辑如下:

left = 0

right  = 0

while  right < len(s):

    # 右指针右移增大窗口

    window.add(s[right])

    right  += 1

    while isvalid:

        # 当满足某种条件时开始从左边收缩窗口

        window.remove(s[left])

        left += 1

代码模板:

def slidingWindow(s, t):

    from collections import defaultdict

    # defaultdict(int)对于不存在的键默认值为0,

    # 可以直接进行window[c] += 1的操作,免去了判断过程

    window = defaultdict(int)

    needs  = defaultdict(int)

    left = 0

    right = 0

    for c in t:

        needs[c] += 1

    while right < len(s):

        # c1为移入窗口的字符

        c1 = s[right]

        # 窗口右移

        right += 1

        # 进行窗口内数据的相关操作

        # TODO

        # 判断左侧窗口是否要收缩

        while window needs shrink:

            # c2为将要移出窗口的字符

            c2 = s[left]

            # 左指针右移,收缩窗口

            left += 1

            # 进行窗口内数据的相关操作

            # TODO

相关Leetcode题目

  1. 最小覆盖子串

class Solution:

    def minWindow(self, s: str, t: str) -> str:

        from collections import defaultdict

        needs = defaultdict(int)

        window = defaultdict(int)

        left = 0

        right = 0

        count = 0 #window中满足条件的字符数

        start = 0 #记录最小子串的起始位置

        min_len = float('inf') #记录最小子串的长度

        for c in t:

            needs[c] += 1

        while right < len(s):

            c1 = s[right]

            right += 1

            if  c1 in needs:

                window[c1] += 1

                if window[c1] == needs[c1]:

                    count += 1

            while count == len(needs):

                # 更新最小覆盖子串

                if right - left < min_len:

                    start = left

                    min_len = right - left

                c2 = s[left]

                left += 1

                if c2 in needs:

                    window[c2] -= 1

                    if window[c2] < needs[c2]:

                        count -= 1

        if min_len == float('inf'):

            return ''

        else:

            return s[start:start+min_len]

  1. 字符串排列

class Solution:

    def checkInclusion(self, s1: str, s2: str) -> bool:

        from collections  import defaultdict

        needs = defaultdict(int)

        for c in s1:

            needs[c] += 1

        window = defaultdict(int)

        left = 0

        right = 0

        count = 0

        while right < len(s2):

            c1 = s2[right]

            right += 1

            if c1 in needs:

                window[c1] += 1

                if window[c1] == needs[c1]:

                    count += 1

            while count == len(needs):

                if right - left == len(s1):

                    # 如果子串长度与s1相等则包含

                    return True

                c2 = s2[left]

                if c2 in needs:

                    window[c2] -= 1

                    if window[c2] < needs[c2]:

                        count -= 1

                left += 1

        return False

  1. 找所有字母异位词

class Solution:

    def findAnagrams(self, s: str, p: str) -> List[int]:

        from collections import defaultdict

        needs = defaultdict(int)

        window = defaultdict(int)

        left = 0

        right = 0

        count = 0

        res = []

        for c in p:

            needs[c] += 1

        while right < len(s):

            c1 = s[right]

            if c1 in needs:

                window[c1] += 1

                if window[c1] == needs[c1]:

                    count += 1

            right += 1

            while count == len(needs):

                if right - left == len(p):

                    res.append(left)

                c2 = s[left]

                if c2 in needs:

                    window[c2] -= 1

                    if window[c2] < needs[c2]:

                        count -= 1

                left += 1

        return res

  1. 最长无重复子串

class Solution:

    def lengthOfLongestSubstring(self, s: str) -> int:

        max_len = 0

        left = 0

        right = 0

        n = len(s)

        from collections import defaultdict

        window = defaultdict(int)

        while right < n:

            c1 = s[right]

            right += 1

            window[c1] += 1

            while window[c1] > 1:

                c2 = s[left]

                left += 1

                window[c2] -= 1

            max_len = max(max_len, right - left)

        return max_len

关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

觉得不错的小伙伴,感谢点赞、关注加收藏哦!

欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/263936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

110基于matlab的混合方法组合的极限学习机和稀疏表示进行分类

基于matlab的混合方法组合的极限学习机和稀疏表示进行分类。通过将极限学习机&#xff08;ELM&#xff09;和稀疏表示&#xff08;SRC&#xff09;结合到统一框架中&#xff0c;混合分类器具有快速测试&#xff08;ELM的优点&#xff09;的优点&#xff0c;且显示出显着的分类精…

网安面试三十道题(持续更新)(sql注入系列)

61 给你一个网站&#xff0c;一般怎么做渗透测试的 先确定黑盒测试还是白盒测试 黑盒测试 信息收集&#xff1a; 服务器相关---&#xff1a;系统版本&#xff0c;真实IP&#xff0c;开放端口&#xff0c;使用的中间件 指纹信息---有无cdn加速&#xff0c;dns解析记录&#xff0…

ARM GIC(三) gicv2架构

ARM的cpu,特别是cortex-A系列的CPU,目前都是多core的cpu,因此对于多core的cpu的中断管理,就不能像单core那样简单去管理,由此arm定义了GICv2架构,来支持多核cpu的中断管理 一、gicv2架构 GICv2,支持最大8个core。其框图如下图所示: 在gicv2中,gic由两个大模块组成: …

页面级UI状态存储LocalStorage

目录 1、LocalStorageProp 2、LocalStorageLink 3、LocalStorage的使用 4、从UI内部使用LocalStorage 5、LocalStorageProp和LocalStorage单向同步的简单场景 6、LocalStorageLink和LocalStorage双向同步的简单场景 7、兄弟节点之间同步状态变量 LocalStorage是页面级的…

FISCO BCOS 中webase-deploy配置项详细说明

本文整理了webase-deploy的相关配置,例如如何webase启用基于自己搭的链,而不启用默认的两节点链 1.WeBASE 子系统版本 指定了 WeBASE 的各个子系统&#xff08;web、mgr、sign、front&#xff09;的版本号为 v1.5.5。 2.Docker 相关配置: docker.mysql 3.如果使用 Docker 安装&…

重温经典struts1之国际化(I18N)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 拿Google网站来举例&#xff0c;在世界上不同国家和地区&#xff0c;登陆Google网站&#xff0c;网站上都会显示本国家语言&#xff0c;它是怎么做到的&#xff0c;就是…

FasterRCNN目标检测

R-CNN 四个步骤: 对输入图片提取候选区&#xff08;region proposal&#xff09;&#xff0c;每张大约2000个。论文中采用selective search的方法。对每个候选区采用CNN网络提取特征。此处需要将proposal的尺寸缩放成统一的227x227&#xff0c;以匹配CNN网络。最终提取到的特征…

一款外置MOS开关降压型 LED 恒流控制器应用方案

一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻&#xff0c;能控制高亮度 LE…

基于ssm+jsp学生综合测评管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把学生综合测评管理与现在网络相结合&#xff0c;利用java技术建设学生综合测评管理系统&#xff0c;实现学生综合测评的信息化。则对于进一步提高学生综合测评管理发展&#xff0c;丰富学生综合测评管理经验能起到不少的促进作用。…

【运维面试100问】(十一)淡淡I/O过程

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

手把手教你基于 FastGPT 搭建个人知识库

前言 大家好&#xff0c;我是潇潇雨声。我发现在使用 GPT 时&#xff0c;尽管它能够生成一些小红书文案和日志&#xff0c;但内容常常显得空洞缺乏深度。今天我想分享一个解决这个问题的方法&#xff0c;那就是基于开源项目 FastGPT[1]。 我们可以通过向 GPT 提供一些有针对性的…

大数据技术基本功-数据采集

产品指南&#xff5c;DataScale自定义采集器功能介绍产品指南&#xff5c;开发 DataScale Collector​​​​​​​

鸿蒙和各大厂合作,是不是要火起来

今年9月底&#xff0c;在华为秋季全场景新品发布会上&#xff0c;华为常务董事、终端BG CEO余承东宣布&#xff0c;鸿蒙原生应用全面启动&#xff0c;HarmonyOS NEXT开发者预览版将在2024年第一季度开放。 近日&#xff0c;腾讯、阿里、美团、网易&#xff0c;外包大厂中软国际…

从零开始创建GPTs 人人都可以编写自己的ChatGPT产品

在这个人工智能迅猛发展的时代&#xff0c;GPT&#xff08;生成式预训练变换器&#xff09;已经成为一项令人兴奋的技术&#xff0c;它打开了创意和知识的新大门。无论你是一名编程新手、一位热爱探索的学生&#xff0c;还是对未来充满好奇的专业人士&#xff0c;GPTs都可以为你…

代码随想录算法训练营Day7 | 233.用栈实现队列、225.用队列实现栈

LeeCode 233 用栈实现队列 本题思路&#xff1a;使用两个栈来实现队列&#xff0c;应该怎么做呢&#xff1f;我们通过画图来分析下 入队列的时候&#xff0c;直接在 stackin 入出队列的时候&#xff0c;肯定是先出 1 &#xff0c;此时把&#xff0c;stackin 中全部 弹出到 入到…

DBeaver连接hive

1.新建hive连接 其中主机填写hive所在节点地址&#xff0c;端口10000为默认&#xff0c;数据库名不填则是默认default数据库&#xff0c;用户名密码填写hadoop集群中能操作hdfs的用户和密码。 2.编辑驱动&#xff0c;驱动的jar包从安装的hive下的jdbc路径下获取&#xff0c;例…

【HarmonyOS开发】ArkTs使用Http封装

1、鸿蒙中如何进行网络请求 1.1 三方库请求 ohos/axios ohos/retrofit ohos/httpclient 1.2 鸿蒙原生请求 ohos.net.http 2、ArkTs请求模块ohos.net.http 本模块提供HTTP数据请求能力。应用可以通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD…

【电源专题】Buck电源上电震荡谁的错?

在文章:【电源专题】案例:Buck芯片上电瞬间波形震荡?从别的人案例中来学习软启参数中我们通过别人的文章了解到了Buck芯片上电瞬间波形震荡有几个方法可以解决,但主要还是围绕着软启动参数去学习。因为文章中无法知道编者所用的电源芯片和电路,所以无法进行分析。 最近我…

《每天一分钟学习C语言·七》指针、字节对齐等

1、 对于二维数组如a[3][4]可以当做有三个元素的一维数组&#xff0c;每个元素包含四个小元素。 2、 printf(“%-5d”, i); //负号表示左对齐&#xff0c;5d表示空五个光标的位置 3、 栈&#xff1a;先进后出&#xff0c;堆&#xff1a;先进先出 4、 &#xff08;1&#xff…

零代码助力服装行业数字化转型

内容来自演讲&#xff1a;涂岳俊 | 广州市衣湛国际信息科技有限公司 | CEO 摘要 这篇文章讨论了为什么选择明道云零代码平台&#xff0c;以及它如何帮助服装企业解决各种问题。作者分享了自己的经验&#xff0c;并列举了一些成功的案例来证明零代码平台的优势。文章还提到了在…