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

news2025/2/1 14:00:29

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能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:阿旭算法与机器学习,共同学习交流~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现

目录 关键词平台说明前言一、总体流程二、配置2.1 DCM and DEM2.2 BSWM2.2.1 Mode Notifaication Port2.2.2 Rules 2.3 service port2.3.1 做好DCM-->BSWM 和DCM -->SWC_Diag 的server port mapping2.3.2 做好BSWM ESH_ModeNotification 的server port mapping 2.4 SWC 中…

美好蕴育润康:为孕产期女性量身定制的专业营养

如今&#xff0c;孕产期是女性人生中特别而又重要的阶段。这段时间&#xff0c;孕期妈妈经常饱受许多痛苦和不适&#xff0c;更需要额外的关爱和呵护&#xff0c;以确保母婴健康。为了满足孕产期女性特殊的营养需求&#xff0c;美好蕴育润康应运而生&#xff0c;成为她们身边的…

web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

写在前面 最近在写一个web项目&#xff0c;需要实现web客户端之间的语音通话&#xff0c;期望能够借助webSocket全双工通信的方式来实现&#xff0c;但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后只能听到“嘀嘀嘀”的杂音 解决方案&#xff1a;使用Jso…

QC/PD快充电源产品应用介绍

• 原边650-700V SJ MOSFET采用低FOM值的ESM 技术&#xff0c;有利于提高系统效 率&#xff0c; 以及更佳的EAS和EMI等特性&#xff0c;对于一些不含PFC电路的系统更友好。 • 副边采用低FOM值的SGT同步整流电路&#xff0c;相比肖特基二极管整流能有更低的 损耗&#xff0c;有…

2023年12月GESP认证C++等级考试(三级)真题试卷

2023年12月GESP认证C等级考试&#xff08;三级&#xff09;真题试卷 题目总数&#xff1a;27 总分数&#xff1a;100 选择题 第 1 题 单选题 下⾯C数组的定义中&#xff0c;会丢失数据的是( )。 A. char dict_key[] {p,t,o}; B. int dict_value[] {33,22,11}; C. char …

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言&#xff1a;本文不介绍 AOP 的基本概念、动态代理方式实现 AOP&#xff0c;以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP&#xff0c;也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…

如何用低成本进行宣传?媒介盒子分享

企业创立之初想要用低成本取得较好的宣传效果可以实现吗&#xff1f;可以。软文营销就能帮助企业做到。 然而数字时代中用户接受到的信息数量远远超过他们的理解能力。所以只有那些用户喜欢看到的信息才会被注意到&#xff0c;宣传才能起到效果。今天媒介盒子就来和大家聊聊&a…

软件测试:最强面试题整理出炉附答案,一点点小总结,建议收藏

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以点…

【P2PTransportChannel 】2: 创建Connetion、 BasicPortAllocatorSession

基于m98P2PTransportChannel::MaybeStartGathering() 触发PortAllocator 对 session的管理(创建等) P2PTransportChannel::MaybeStartGathering() session都放在PortAllocator的 一个vector 中:std::vector<std::unique_ptr<PortAllocatorSession>> pooled_sess…

FreeRTOS之任务状态查询

1、相关API函数的使用 uxTaskPriorityGet(Task1Task_Handler);//传入task1的任务句柄,获取任务优先级 vTaskPrioritySet(Task1Task_Handler,30);//改变任务优先级 task_num uxTaskGetNumberOfTasks();//获取任务数量 #include "sys.h" #include "delay.h"…

【CF闯关练习】—— 900分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【Nacos】—客户端与服务端源码解析

Nacos系列 Nacos—简述、注册中心、配置中心 Nacos安装教程 SpringBoot项目与Nacos配置 一、背景介绍 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的服务发现和配置管理工具&#xff0c;它是一个全面的微服务基础设施组件&#xff0c;提供…

微信小程序开发系列-02注册小程序

上一篇文章&#xff0c;创建了一个最小的小程序&#xff0c;但是&#xff0c;还有3个疑问没有弄清楚&#xff0c;还是基于demo1工程&#xff0c;这篇文章继续探索。 当前的目录结构是否是完备的呢&#xff1f;&#xff08;虽然小程序可以运行起来&#xff09;app.js文件内容还…

GrayLog日志平台的基本使用-收集系统日志

1、新建Indices 2、新建Input Inputs新增syslog UDP的类型&#xff0c;接收端口为1514 UDP 用于接收Linux服务器使用rsyslog转发过来的系统日志 Input配置后&#xff0c;需要开放端口&#xff1a;firewall-cmd --permanent --zonepublic --add-port1514/udp; firewall-cmd --r…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧机场

智慧机场可视化平台通过可视化手段&#xff0c;将复杂的机场运营数据以图形、图表等形式展现&#xff0c;使管理者能够更直观、实时地了解机场的各个方面。飞渡科技通过整合物联网IOT、人工智能、大数据分析等技术&#xff0c;围绕机场管理、运控、安防、服务、监测等业务领域&…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下&#xff0c;完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

智赋百景|2023-2024年福建省大数据集团数据应用开发大赛重磅开赛!

为推动数据要素赋能千行百业&#xff0c;拓展自然语言处理技术在不同业务场景下的落地应用&#xff0c;进一步实现“智赋百景”&#xff0c;由福建省大数据集团有限公司主办&#xff0c;福建大数据一级开发有限公司、福建大数据交易有限公司、福建省数字经济产业工会共同承办的…

【小白专用】php以pdo方式连接sqlserver,开启sqlsrv扩展

一、安装ODBC程序&#xff0c; 下载适用于 SQL Server 的 ODBC 驱动程序 - 适用于 SQL Server 的 ODBC 驱动程序 |Microsoft 学习 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协议中的条款后选择下一步&#xff1b; 点击安…

告别高昂存储,高效灵活管理数据

前言 在当今数字化时代&#xff0c;企业面临着海量数据的挑战&#xff0c;这些数据承载着技术创新和业务发展的重要使命。因此&#xff0c;高效、安全地收集、存储和管理数据成为了企业关注的焦点。对于需要长期储存且低频聚合分析的数据&#xff0c;组织需要更加低成本和便捷…

Android平台RTSP流如何添加动态水印后转推RTMP或轻量级RTSP服务

技术背景 我们在对接外部开发者的时候&#xff0c;遇到这样的技术诉求&#xff0c;客户用于地下管道检测场景&#xff0c;需要把摄像头的数据拉取过来&#xff0c;然后叠加上实时位置、施工单位、施工人员等信息&#xff0c;然后对外输出新的RTSP流&#xff0c;并本地录制一份…