寻找最小覆盖子串 - LeetCode 76

Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析 题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。 注意: 对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。 如果s中存在这样的子串,我们保证它是唯一的答案。 示例 示例 1: 输入:s = "ADOBECODEBANC... 阅读详情

寻找最小覆盖子串 - LeetCode 76

LeetCode76. 最小覆盖子串
给定一个字符串 s 和一个字符串 t,我们的任务是找到 s 中包含 t 所有字符的最小子串。如果找不到,返回空字符串。

问题背景

这个问题实际上是滑动窗口(Sliding Window)类型的问题,通常用于在字符串中查找满足一些条件的子串。在该问题中,我们要找到一个包含 t 所有字符的最小子串。

相关知识

在解决这个问题之前,让我们了解一些相关的知识点。

滑动窗口

滑动窗口是一种经典的算法思想,通常用于解决一些字符串和数组相关的问题。它通过维护一个子数组或子串,通过左右边界的移动,来寻找符合某种条件的子数组或子串。

滑动窗口算法的一般步骤如下:

  1. 初始化左右指针 left 和 right,通常都指向数组的第一个元素。
  2. 移动右指针 right,扩大窗口,直到满足某种条件,停止。
  3. 移动左指针 left,缩小窗口,直到不满足条件,停止。
  4. 重复步骤2和步骤3,直到遍历完整个数组。

哈希表

哈希表(Hash Table)是一种非常常见的数据结构,用于存储键-值对(Key-Value Pairs)。它通过哈希函数将键映射到对应的位置,从而实现了快速的查找和插入操作。

问题介绍

给定字符串 s 和 t,我们要找到 s 中包含 t 所有字符的最小子串。如果不存在这样的子串,返回空字符串。

问题示例

让我们通过一些示例来更好地理解这个问题。

示例 1

输入:

s = "ADOBECODEBANC", t = "ABC"

输出:

"BANC"

解释:

最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。

示例 2

输入:

s = "a", t = "a"

输出:

"a"

解释:

整个字符串 s 就是最小覆盖子串。

示例 3

输入:

s = "a", t = "aa"

输出:

""

解释:

t 中有两个字符 ‘a’,但 s 中不存在符合条件的子字符串,因此返回空字符串。

解题思路

为了解决这个问题,我们可以使用滑动窗口算法。我们需要维护两个指针 left 和 right,分别表示窗口的左边界和右边界,以及一个哈希表 need 来记录字符串 t 中每个字符的出现次数。

具体步骤如下:

  1. 初始化指针 left 和 right,以及哈希表 need。
  2. 从左到右移动右指针 right,扩大窗口,如果 s[right] 是 t 中的字符,更新哈希表 need。
  3. 当窗口包含 t 中所有字符时,移动左指针 left,缩小窗口,更新 need 和记录结果。
  4. 重复步骤2和步骤3,直到遍历完整个字符串 s。

让我们来看一下代码实现,同时加入注释以更好地理解每一步。

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if len(s) < len(t):
            return ""  # 如果s比t短,无法包含t的所有字符,直接返回空字符串
        
        need = collections.defaultdict(int)  # 创建哈希表用于记录t中每个字符的出现次数
        for c in t:
            need[c] += 1  # 初始化need哈希表
        
        needCnt = len(t)  # 需要的字符总数
        left = 0  # 滑动窗口的左指针
        res = (0, float('inf'))  # 记录结果,初始窗口范围为正无穷大
        
        for right, c in enumerate(s):
            if need[c] > 0:
                needCnt -= 1  # 当s[right]是t中字符,needCnt减少
            need[c] -= 1  # 更新need哈希表
            
            if needCnt == 0:  # 当needCnt为0,表示窗口包含了t的所有字符
                while True:
                    c = s[left]
                    if need[c] == 0:
                        break
                    need[c]

 += 1  # 移动左指针,缩小窗口,同时更新need哈希表
                    left += 1
                
                if right - left < res[1] - res[0]:  # 更新最小窗口范围
                    res = (left, right)
                
                need[s[left]] += 1  # 左指针右移,需要的字符加1
                needCnt += 1  # needCnt加1,窗口不再包含t的所有字符
                left += 1  # 左指针右移
        
        return '' if res[1] > len(s) else s[res[0]:res[1]+1]  # 返回最小覆盖子串

时间和空间复杂度

  • 时间复杂度:O(N),其中 N 为字符串 s 的长度。我们遍历字符串 s 一次,同时使用双指针维护滑动窗口。
  • 空间复杂度:O(K),其中 K 为字符串 t 的长度。哈希表 need 最多包含 t 中所有不同字符的出现次数。

结论

通过使用滑动窗口算法和哈希表,在时间复杂度为 O(N) 的情况下,我们成功找到了字符串 s 中包含字符串 t 所有字符的最小子串。这是一个经典的算法问题,也是一个非常重要的技巧。希望这篇博客对你有所帮助,让你更好地理解和掌握这一技术。

最小覆盖子串 最小覆盖子串,滑动窗口,尺取法 阅读详情

相关推荐

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1973

Leetcode76最小覆盖子串(滑动窗口解法)

Leetcode76最小覆盖子串(滑动窗口解法) 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 答题: /** * @param {string} s * @param {string} t * @return {string} */ var minW

伯约同学的前端学习之路 635

SAP 小结

关于SAP 开发的实习就要告一段落了,从刚开始接触,到现在已经6个月了,想要很简要的把自己对SAP的理解写出来,便于以后查阅(不定期更新)。 1. 什么是SAP? 广义的SAP,可以指代SAP公司以及SAP的各种产品,它的意义要在特定语境下才能确定。一般我们所说的SAP特指SAP ERP。 SAP ERP(enterprise resource planning)是一个企业信息系统。通过这个系

Remy的博客 1955

Leetcode(76)——最小覆盖子串

76. 最小覆盖子串

KCDCY的博客 2750

D触发器版图设计的艺术:最小化面积与最大化性能的平衡之道

本文探讨了D触发器版图设计中如何平衡最小化面积与最大化性能的核心挑战。通过分析晶体管布局、互联优化、时钟分布等关键策略,结合先进制程下的功耗与信号完整性考量,为数字IC工程师提供了从基础优化到制造验证的实用解决方案,助力实现高性能、低面积的芯片设计。

aa123的博客 911

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1593

76. 最小覆盖子串

题解:https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong-yong-si-xiang-by-/%E5%8F%8C%E6%8C%87%E9%92%88%E6%8A%80%E5%B7%A7.md 算法模版: /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map&l..

INGNIGHT的专栏 651

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5540

LeetCode 76 最小覆盖子串

LeetCode 76 最小覆盖子串 最小覆盖子串 题目描述 题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 题解 这题属于滑动窗口类型。思路简单来说就是,用start、end控制一个滑动窗口。当滑动窗口中未包含所有T中字符,end右移

newbiee的博客 256

2026软件测试面试题全解析:从用例设计到接口自动化与性能实战

在软件测试岗位的招聘考察中,面试官越来越看重候选人解决实际问题的工程能力,而不仅仅是背诵概念。从最基础的测试用例设计出发,覆盖功能测试、接口测试、自动化测试、性能测试、数据库与Redis一致性等核心知识体系,是应对中高级岗位面试的关键路径。理解Postman抓包、Python脚本、Pytest框架、JMeter压测指标背后的原理,能帮助测试人员构建完整的质量保障思维。当AI辅助测试成为行业新趋势时,掌握数据校验链路与风险识别意识,更能体现资深测试工程师的竞争力。本文围绕2026年高频软件测试面试题,梳理了从

weixin_28676289的博客 246

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

Leetcode 76. 最小覆盖子串 C++

Leetcode 76. 最小覆盖子串 题目 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 测试样例 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 题解 滑动窗口 用一个哈希表记录目标单词的字母及其出现个数。然后用这个哈希表对窗口的字母进行计数。进入右边界则进行+1,出左边界则-1。显然,只要值大于

weixin_43750513的博客 445

基于大语言模型的多轮对话系统优化研究

基于大语言模型的多轮对话系统优化研究 摘要 本研究针对大语言模型在多轮对话场景中的性能衰减问题,提出了一套系统优化方案。通过分层存储架构(短期记忆层、中期摘要层、长期知识层)和混合检索策略优化上下文管理,设计动态槽位填充框架增强对话状态跟踪,引入熵引导的重置算法改进生成策略,并采用双路径加载架构突破I/O瓶颈。实验表明,该方案使任务完成率提升28.6%,响应一致性提高41.2%,推理延迟降低35.8%,为构建高性能智能对话系统提供了实用技术路径。 关键词:大语言模型;多轮对话;上下文管理;状态跟踪~~~~~

huanghm88的专栏 663

LeetCode76.最小覆盖子串

LeetCode76.最小覆盖子串 问题 解题思路 滑动窗口: ​ 主要的使用技巧就是维护一个窗口,从开始到末尾不断的滑动,然后更新长度。 /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid

冢狐的私人空间 574

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

力扣76.最小覆盖子串 记录

记录一下自己的学习思路,和对代码详细注释。主要用到 哈希表,滑动窗口。感觉难点在窗口边界移动时的更新条件。可以看看B站这个视频,up跟着思路推一边。

沙福林大人博客 342

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

力扣爆刷第113天之CodeTop100五连刷51-55

思路:零钱数量无限,正序遍历,求达到总数所需的最少硬币数,定义dp[i]表示,装满 i 所需的最少硬币数,那么,动态规划的状态转移,一定是从上一个硬币位置开始的,也就是 i - coins[j],这个位置,即 dp[i - coins[j]],上一个硬币位置只要是有值的,那么就可以推导出状态转移,是dp[i]=dp[i - coins[j]] + 1,当然还得再和自身历史值进行比较,留下最小值。思路:典型滑动窗口,维护好一个变量值,作为进入滑动窗口的契机,没进入时扩大右边界,进入时,缩小左边界。

qq_43511039的博客 512

Java题解LeetCode——76.最小覆盖子串

LeetCode——76.最小覆盖子串 题目 76.最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解析 今天仔细看了题解,原来子串是连续的,以前我以为是不连续的。 注意,在官方题解中说字符串T中可能出现重复字符,所以在包含字符的同时

影龙武的博客qq_43594119 599

LeetCode 76最小覆盖子串

LeetCode 76最小覆盖子串 题目简述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。如果 S 中存在这样的子串,我们保证它是唯一的答案;如果 S 中不存这样的子串,则返回空字符串。 输入:S = “ADOBECODEBANC”, T = “ABC” 输出:“BANC” 思路: 利用哈希表记录字符串T中每个字符的数量,hash[ch]++,表示ch字符还缺少的数量 利用双指针遍历字符串S,同时用一个哈希表统计指针j , i之间的每种字符

XBlog 160

力扣刷题-热题100题-第12题(c++、python)

在python中是以时间空间都比较平衡的方式,以一个Counter的数据类型tc对t中字符进行统计,然后对s进行遍历,在遍历中对tc进行操作也进行重合字符的计数,当s中字符在tc中时,相应字符数量-1,但重合计数+1,且把这个位置放到数组index中,直到重合数量有t那么大,取出index的第一个元素作为左指针位置(这样左指针不用累加的操作,直接以位置数组的第一个元素赋值),来看左右指针长度,若更小就替换,且右指针右移。直到s中的左指针的字符比t中的还多时,左指针右移;c++是力扣官网评论区大佬的。

weixin_44505472的博客 1896

Leetcode 76. 最小覆盖子串

【代码】Leetcode 76. 最小覆盖子串。

salmonwilliam的博客 474

leetcode76. 最小覆盖子串-滑动窗口hard

leetcode76. 最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 滑动窗口 看了题解才明白的。 首先用map记录t字符串每个字符出现的次数,然后窗口也有一个对应的map。每次窗口变化的时候,判断窗口的map里面的每个值

peony的博客 266

[LeetCode76] 最小覆盖子串

解法 package com.wangxiaohu; import java.util.HashMap; import java.util.Map; public class LeetCode76 { public static void main(String[] args) { String s = "ADOBECODEBANC"; String t = "ABC"; LeetCode76 leetCode76 = new LeetCode7

StormWangxhu的博客 86

力扣76. 最小覆盖子串(滑动窗口)

力扣76. 最小覆盖子串(滑动窗口)

LNsupermali的博客 756

算法-最小覆盖子串

算法-最小覆盖子串1、算法-最小覆盖子串 1、算法-最小覆盖子串 本题来源于:LeetCode-76 难度hard。 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 题目很好理解,翻译成大白话就是在字符串S中,找出一段包含字符串T中所有元素的,

qq_23594799的博客 449

LeetCode 76. 最小覆盖子串

通过在字符串s中动态维护一个可变窗口,利用双指针扩展右边界寻找包含t所有字符的窗口,然后收缩左边界优化最小子串,同时使用哈希映射精确跟踪字符频率,最终以线性时间复杂度O(n)找到最小覆盖子串。最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。所有字符的子串,则返回空字符串。整个字符串 s 是最小覆盖子串。所有字符的最小子串。

qscfgjn的博客 286

最小覆盖子串详解——Java

最小覆盖子串详解 76.最小覆盖子串 链接:https://leetcode-cn.com/problems/minimum-window-substring 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1: 输入:s = “ADOBECODEBANC”, t = “ABC” 输出:“BANC” 示例 2: 输入:s = “a”,

QDNBD的博客 1479
上一篇: 滑动窗口最大值
BugII_
博客等级 码龄8年 6770粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值