力扣76最小覆盖子串

Java实现 LeetCode 76 最小覆盖子串 76. 最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 class Solution { //滑动窗口的应用 ... 阅读详情

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

注意:

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

示例 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

需要两个HashMap,一个记录字符串t中字符出现的频率,一个用于统计当前滑动窗口中在字符串t中字符的出现数量,另外两个一个have用于统计当前滑动窗口中满足条件的字符数,一个tcount统计总共字符数量。
class Solution {
     public String minWindow(String s, String t) {
        // 先判断一下s和t的长度,如果任何一个长度为0,返回空字符串
        if (s.length() == 0 || t.length() == 0) {
            return "";
        }

        // 定义两个哈希表,一个统计t中字符的频率,另一个统计滑动窗口中字符的频率
        Map<Character, Integer> mapT = new HashMap<>();
        Map<Character, Integer> mapW = new HashMap<>();

        // 统计t中字符的频率
        for (char c : t.toCharArray()) {
            mapT.put(c, mapT.getOrDefault(c, 0) + 1);
        }

        // 统计t中不同字符的数量
        int tCount = mapT.size();

        // have变量用于统计滑动窗口中满足t中字符频率的字符数量
        int have = 0;

        // 定义结果字符串的起点和长度
        int resStart = 0, resLen = Integer.MAX_VALUE;

        // 滑动窗口的左右边界
        int left = 0, right = 0;

        // 遍历字符串s
        while (right < s.length()) {
            char rightChar = s.charAt(right);

            // 如果当前字符在t中,更新滑动窗口中的字符频率
            if (mapT.containsKey(rightChar)) {
                mapW.put(rightChar, mapW.getOrDefault(rightChar, 0) + 1);

                // 如果滑动窗口中当前字符的频率与t中字符的频率相等,更新have
                if (mapT.get(rightChar).equals(mapW.get(rightChar))) {
                    have++;
                }
            }

            // 当滑动窗口满足条件时,尝试缩小窗口
            while (have == tCount) {
                // 如果当前窗口的长度小于之前记录的最小长度,更新最小长度和起点
                if (right - left + 1 < resLen) {
                    resLen = right - left + 1;
                    resStart = left;
                }

                // 移动左边界,缩小窗口
                char leftChar = s.charAt(left);

                // 如果左边界字符在t中,更新滑动窗口中的字符频率和have
                if (mapT.containsKey(leftChar)) {
                    mapW.put(leftChar, mapW.get(leftChar) - 1);

                    // 如果滑动窗口中当前字符的频率小于t中字符的频率,更新have
                    if (mapW.get(leftChar) < mapT.get(leftChar)) {
                        have--;
                    }
                }

                left++;
            }

            // 移动右边界,扩大窗口
            right++;
        }

        // 如果没有找到符合条件的窗口,返回空字符串
        if (resLen == Integer.MAX_VALUE) {
            return "";
        }

        // 返回结果字符串
        return s.substring(resStart, resStart + resLen);
    }
}

LeetCode 76. 最小覆盖子串 | Python 使用滑动窗口的思想,解决《76. 最小覆盖子串》问题 阅读详情

相关推荐

Leetcode76 最小覆盖子串题解

LeetCode 76 最小覆盖子串讲解,用滑动窗口解决,利用哈希表记录字符变化。

算法笨蛋 703

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

76. 最小覆盖子串

KCDCY的博客 2750

最小覆盖子串

最小覆盖子串,滑动窗口,尺取法

优快云 7455

Leetcode 最小覆盖子串

处理右边界时先更新count是为了确保在当前字符进入窗口时,能够及时检查它是否满足匹配需求。只有在count减少之后,才能表明该字符被正确匹配。后更新HashMap是为了保证窗口的状态准确地反映已经包含的字符频率。处理左边界时先更新HashMap是为了表示当前字符即将从窗口中移除。只有更新了字符的频率之后,才能判断窗口是否还满足条件。后更新count是因为我们需要在频率变化之后才能判断该字符是否已经不足。如果移出字符后,窗口中还需要再次匹配该字符,那么count才会增加。右边界的顺序。

985小菜鸡 1324

【困难】力扣算法题解析LeetCode76:最小覆盖子串

题目要求找出字符串 s 中涵盖 t 所有字符的最小子串。使用滑动窗口算法,通过双指针动态调整窗口范围:右指针扩展窗口直至覆盖 t 的所有字符,左指针收缩窗口以寻找最小子串。通过字符频率数组记录匹配状态,确保时间复杂度为 O(m+n)。例如,s = "ADOBECODEBANC",t = "ABC" 时,最小覆盖子串为 "BANC"。若无法满足条件(如 s = "a",t = "aa"),返回空字符串。该

ylumwd的博客 913

ESP32S3 Korvo2V3四通道AEC配置实战:基于AFE的回声消除优化

本文详细介绍了在ESP32S3 Korvo2V3平台上配置四通道AEC(回声消除)的实战经验。通过AFE算法优化和硬件连接调试,实现高质量回声消除,显著提升智能音箱和会议设备的语音交互体验。重点解析了四通道配置、数据格式对齐和参数调优等关键技术要点。

elastic6hunter的博客 936

【LeeCode】*76. 最小覆盖子串

*76. 最小覆盖子串

LeeYotta的博客 642

滞回比较器电路详细分析

滞回比较器是一种用于检测两个不同电压值并使比较器输出高电平或低电平的电路。滞回比较器的特点是具有迟滞特性,即当输入电压高于某一阈值时,比较器输出高电平,当输入电压低于另一阈值时,比较器输出低电平,而在这两个阈值之间,比较器的输出保持不变。比较器通常有两个模拟电压输入端UIN+和UIN-以及一个数字状态输出端UOUT。当UIN+大于UIN-时,UOUT为高电平;当UIN+小于UIN-时,UOUT为低电平。根据具体的系统定义,这两种电位的具体数值可以有所不同。

LuDvei的博客 2万+

力扣(LeetCode) 76.最小覆盖子串(java)

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

Cnc2014的博客 565

学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

amy_mhd的博客 398

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5500

golang力扣leetcode 76.最小覆盖子串

76.最小覆盖子串76.最小覆盖子串题解代码 76.最小覆盖子串 76.最小覆盖子串 题解 滑动窗口模板题,不知道为啥这也能算hard题 右指针右移之后窗口数据更新 判断窗口是否要收缩 左指针右移之后窗口数据更新 根据题意计算结果 代码 package main import "math" func minWindow(s string, t string) string { wind := make(map[byte]int) need := make(map[byte]int) for i

清风 730

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

力扣(LeetCode)100题:76.最小覆盖子串

本文介绍了LeetCode 76题「最小覆盖子串」的滑动窗口解法。该方法使用两个计数器(cnt_s和cnt_t)分别跟踪窗口字符和目标字符串的字符频率,通过比较cnt_s≥cnt_t判断是否满足条件。算法采用"扩张找可行解,收缩找最优解"的策略:right指针扩展窗口,当条件满足时left指针收缩寻找最小窗口。时间复杂度O(|s|+|t|),空间复杂度O(1)(因字符集有限)。关键点包括Python Counter的比较语义和滑动窗口的正确性保证,最后返回满足条件的最短子串或空字符串。

sweet_ran的博客 413

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 298

操作系统|知识梳理|复习(下)

操作系统复习

知识库搭建ing 1784

LeetCode76.最小覆盖子串

LeetCode 76.最小覆盖子串 题目描述: 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-window-substrin

qq_40751552的博客 188

VMware Horizon 8 2111 部署系列(十一)准备RDS主机

RDS (Remote Desktop Service),即远程桌面服务。我们可以使用 Microsoft 远程桌面服务 (RDS) 提供 RDS 主机上的桌面会话并将应用程序传送给多个用户。

白昼的技术专栏 3471

力扣76.最小覆盖子串

力扣76.最小覆盖子串给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。这道题需要思考一个问题,在代码中如何确定字符串s中涵盖字符串t呢?就比如字符串sBCDEAA,字符串tABC,怎么判断字符串s中涵盖了字符串t?我的做法是用两个数组tArray 和 sArray,分别记录字符串t和字符串s每个字符的数量。若字符串t涵盖字符串s,那么对于任意的字符c,都存在,根据这个就可以判断是否涵盖了。

沉迷写代码的程序猿的博客 1094

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 76:最小覆盖子串

给定字符串s和t,需找到 st。若不存在则返回空字符串。

m0_75126572的博客 1379

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

76. 最小覆盖子串 - 力扣(LeetCode)

通俗来讲,滑动窗口本质还是快慢指针法,一快一慢两个指针前后移动,中间的部分就是窗口。内部没有元素存在, 后续遍历会扩大形成滑动窗口,窗口内包含 t 中所有的字符串。解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。因此首先,在字符串 s 中建立快慢指针放在队首,这里初始窗口设计为。解释: t 中两个字符 'a' 均应包含在 s 的子串中,所有字符的最小字符串片段,对字符的顺序无要求。的长度,说明没有找到有效窗口,返回空字符串。输入:s = "a", t = "a"

q1111111da的博客 2160

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

76. 最小覆盖子串【 力扣(LeetCode) 】

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

yyh520025的博客 1274

【力扣76】最小覆盖子串

本文介绍了LeetCode上最小覆盖子串问题的滑动窗口解法。题目要求在母串s中找到包含目标串t所有字符的最短连续子串。核心思路是:1)使用双指针维护滑动窗口,右指针扩展窗口直至包含所有t字符,左指针收缩窗口寻找最短有效子串;2)用固定长度数组替代哈希表统计字符频次,提高效率;3)通过valid和needCount变量快速判断窗口有效性。该算法时间复杂度O(m+n),空间复杂度O(1),是此类子串匹配问题的经典模板解法。掌握扩窗找有效、缩窗求最优的思路可高效解决同类问题。

27届Java后端炒粉练习生,AICoding中........ 656

JavaScript实现最小覆盖子串--力扣(leetcode 76题)

目录 1 问题 2 输入输出 3 解答 滑动窗口 4 代码 1 问题 https://leetcode-cn.com/problems/minimum-window-substring/ 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 2 输入输出 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,

bailizx 717

leetcode_ 76 最小覆盖子串

本文介绍了在字符串s中寻找涵盖字符串t所有字符的最小子串的两种解法。第一种使用不定滑动窗口,每次检查窗口是否满足条件,时间复杂度O(n+52m)。第二种优化方法通过记录字符差值来减少判断时间,时间复杂度O(n+m)。两种方法的空间复杂度均为O(52)。文章还提醒注意处理无解情况,并提供了C++实现代码。

bdn_nbd的博客 1193

LeetCode 76 最小覆盖子串

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

newbiee的博客 256
上一篇: 力扣560和为K的数组
下一篇: 力扣53最大子数组和
format_push
博客等级 码龄4年 104粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值