力扣刷题之旅:进阶篇(四)—— 滑动窗口问题

   力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。  

--点击进入刷题地址


引言: 

        在编程的世界里,滑动窗口问题是一种常见且具有挑战性的问题类型。在力扣(LeetCode)上,这类问题往往以其独特的思维方式和高难度的解法吸引着众多算法爱好者。今天,我们就来一起探讨一道滑动窗口的经典题目:“最小覆盖子串”。

题目描述

       -- 给定一个字符串 S 和一个字符串 T,找出 S 中最短的子串,使得 T 是 S 的子序列。如果 S 中不存在这样的子串,就返回一个空字符串。

示例

输入:

S = "ADOBECODEBANC"
T = "ABC"


输出:

"BANC"

解题思路

  •         这道题目的关键在于理解子序列和子串的区别。子序列是指从原序列中删除一些元素(也可以不删除)后得到的序列,而子串则是指原序列中连续的一段。因此,我们需要找到一个尽可能短的子串,使得这个子串包含了 T 中的所有字符。
  •         为了解决这个问题,我们可以使用滑动窗口的思想。首先,我们使用双指针来定义一个窗口,这个窗口包含了 T 中的所有字符。然后,我们尝试缩小这个窗口的大小,直到无法再缩小为止。最后,我们就得到了一个包含 T 的最短子串。
  •         具体实现时,我们可以使用哈希表来记录 T 中每个字符的出现次数。然后,我们遍历 S,用一个变量来记录当前窗口中已经包含了 T 中的多少个字符。当这个变量等于 T 的长度时,说明我们已经找到了一个包含 T 的子串。此时,我们可以尝试缩小窗口的大小,直到无法再缩小为止。

代码实现

def minWindow(s: str, t: str) -> str:  
    if not s or not t or len(s) < len(t):  
        return ""  
      
    # 记录 t 中每个字符的出现次数  
    target_count = {}  
    for char in t:  
        target_count[char] = target_count.get(char, 0) + 1  
      
    # 使用滑动窗口来查找最短子串  
    left, right = 0, 0  # 窗口的左右指针  
    formed = 0  # 记录当前窗口中已经包含了 t 中的多少个字符  
    min_len = float('inf')  # 最小子串的长度  
    min_left = min_right = 0  # 最小子串的左右指针  
      
    while right < len(s):  
        char = s[right]  
        right += 1  
          
        # 如果当前字符在 t 中出现过,则增加 formed 的计数  
        if char in target_count:  
            formed += 1  
              
        # 当 formed 的计数等于 t 的长度时,说明已经找到了一个包含 t 的子串  
        while formed == len(t):  
            # 更新最小子串的长度和左右指针  
            if right - left < min_len:  
                min_len = right - left  
                min_left = left  
                min_right = right  
              
            char = s[left]  
            left += 1  
              
            # 如果当前字符在 t 中出现过,则减少 formed 的计数  
            if char in target_count:  
                formed -= 1  
      
    return s[min_left:min_right] if min_len != float('inf') else ""

总结

        滑动窗口问题是算法学习中的一个重要部分,它考验着我们的思维能力和编程技巧。通过这道题目的练习,我们可以更加深入地理解滑动窗口的思想,掌握其在实际问题中的应用。同时,我们也应该注意到,滑动窗口问题往往有多种解法,我们应该多尝试不同的方法,以便更好地提高自己的算法水平。

 

 

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

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

相关文章

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

自制微信红包封面

一.前言 这不是过年了吗&#xff0c;各大平台都发放了免费的微信红包封面&#xff0c;但我老是抢不到QAQ。于是乎&#xff0c;我便想“授人以鱼不如授人以渔”&#xff0c;不如自己造个封面。 二.主要步骤 1.条件 1>创建视频号 2>过去一年发表过视频号 3>过去一…

比较6*6范围内7个点182个结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中有7个点&#xff0c;让B全是0&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 得到顺序为 用6个点的结构标…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

整合 Axios

大家好我是苏麟 , 今天聊一下Axios . Axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpReques…

C++ 中的模型预测控制(01/2)

目录 一、说明二、MPC原理说明三、分解算法的来源并显示关键特征&#xff0c;四、C 实现说明五、平衡 Q 和 R六、资源下载地址 一、说明 以下文章介绍了应用模型预测控制器的简单控制系统方法。本文讨论了这种控制的基本机制&#xff0c;该机制适用于各种工程领域。 MPC 涉及对…

MPLS VPN功能组件(3)

私网标签分配 通过MPBGP为VPNv4路由分配内层标签 PE从CE接收到IPv4路由后&#xff0c;对该路由加上相应VRF的RD&#xff08;RD手动配置&#xff09;&#xff0c;使其成为一条VPNV4路由&#xff0c;然后在路由通告中更改下一跳属性为自己&#xff0c;通常是自己的Loopback地址…

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题&#xff1a;移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…

PWM输入输出

PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff0c;在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行制&#xff0c;来等效地获得所需要的模拟参量&#xff0c;常应用于电机控速、开关电源等领域。 PWM参数 PWM 中有三个重要参数&…

关于CSDN的原力分增长规则,一点个人经验

本文章编写于 2024年2月9日 从2022年开始到现在&#xff0c;官方的原力分增减规则已经改过好几版了&#xff0c;有一些规则描述比较模糊&#xff0c;这里总结了一些个人经验。 原力值增长点&#xff1a; 1.每日发布文章一篇10分&#xff0c;两篇15分&#xff0c;上限15分&am…

Qt QML学习(一):Qt Quick 与 QML 简介

参考引用 QML和Qt Quick快速入门全面认识 Qt Widgets、QML、Qt Quick 1. Qt Widgets、QML、Qt Quick 区别 1.1 QML 和 Qt Quick 是什么关系&#xff1f; 1.1.1 从概念上区分 QML 是一种用户界面规范和标记语言&#xff0c;它允许开发人员创建高性能、流畅的动画和具有视觉吸引…

Red Panda Dev C++ Maker 使用说明

https://download.csdn.net/download/HappyStarLap/88804678https://download.csdn.net/download/HappyStarLap/88804678 下载https://download.csdn.net/download/HappyStarLap/88804678&#xff1a; ​ 这个&#xff0c;就是我们将运行的文件。 ​ 里面加了许多我…

解决“org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务器。服务器未关闭“

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 问题描述 项目部署至Tomcat服务器报错&#xff1a;org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务 器。服务器未关闭&#xff1b;图…

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

猫头虎分享已解决Bug || 备份失败(Backup Failures):BackupFailureException, DataBackupError ❌

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

熔断机制解析:如何用Hystrix保障微服务的稳定性

微服务与系统的弹性设计 大家好,我是小黑,在讲Hystrix之前,咱们得先聊聊微服务架构。想象一下,你把一个大型应用拆成一堆小应用,每个都负责一部分功能,这就是微服务。这样做的好处是显而易见的,更新快,容错性强,每个服务可以独立部署,挺美的对吧?但是,问题也随之而…

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

uni-app x,一个纯原生的Android App开发工具

uni-app x&#xff0c;下一代uni-app&#xff0c;一个神奇的产品。 用vue语法、uni的组件、api&#xff0c;以及uts语言&#xff0c;编译出了kotlin的app。不再使用js引擎和webview。纯纯的kotlin原生app。 uni-app x&#xff0c;让“跨平台开发性能不如原生”的这条曾广为流…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候&#xff0c;需要把板卡顶面丝印层的一个矩形区域&#xff0c;画成白色&#xff0c;但是这个区域内有好几个焊盘&#xff0c;丝印涂色的地方需要避开这几个焊盘&#xff0c;我觉得不能简单的在丝印层画一个矩形完事&#xff0c;最好让丝印层的这个区域&#xff0c;…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项&#xff1a; BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url&#xff0c;username&#xff0c;password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…