当前位置: 首页 > news >正文

16.滑动窗口经典例题:最小覆盖子串(LeetCode 76)算法原理剖析

目录

一、题目解析

二、讲解算法原理

解法一:暴力枚举 + 哈希表

解法二:滑动窗口 + 哈希表

优化:判断条件

三、代码实现


大家好,今天我们来攻克 LeetCode 上的一道经典难题——76. 最小覆盖子串。这道题是滑动窗口算法的典型应用,结合了哈希表来优化判断过程。


一、题目解析

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

注意:

  1. 对于t中重复字符,我们寻找的子串中该字符数量必须不少于t中该字符数量。

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


二、讲解算法原理

解法一:暴力枚举 + 哈希表

解法二:滑动窗口 + 哈希表

这是本题的最优解。核心思想是维护一个窗口[left, right],通过移动左右指针来寻找最小覆盖子串。

  • 核心逻辑:

    1. right 右移:​ 不断扩大窗口,直到窗口包含了t中的所有字符。

    2. left 右移:​ 在满足覆盖条件的前提下,尝试缩小窗口左边界,以找到最小长度。

优化:判断条件

为了优化每次判断窗口是否覆盖t的时间复杂度,我们可以引入一个变量count

  • 思路:​ 使用变量count标记有效字符的种类。

    • 进窗口:​ 当hash2[in] == hash1[in]时,count++

    • 出窗口:​ 当hash2[out] == hash1[out]时,count--

    • 判断条件:​ 当count == hash1.size()时,说明窗口已覆盖t


三、代码实现

class Solution { public String minWindow(String ss, String tt) { char[] s = ss.toCharArray(); char[] t = tt.toCharArray(); int[] hash1 = new int[128]; // 统计字符串 t 中字符的频次 int kinds = 0; // 字符串 t 中,有多少种字符 for(char ch : t) { if(hash1[ch]++ == 0) kinds++; } int[] hash2 = new int[128]; // 统计窗口中字符的频次 int minlen = Integer.MAX_VALUE, begin = -1; for(int left = 0, right = 0, count = 0; right < s.length; right++) { char in = s[right]; if(++hash2[in] == hash1[in]) count++; // 进窗口 + 维护 count while(kinds == count) // 判断 { // 更新结果 if(right - left + 1 < minlen) { begin = left; minlen = right - left + 1; } char out = s[left++]; if(hash2[out]-- == hash1[out]) count--; // 出窗口 + 维护 count } } if(begin == -1) return new String(); else return ss.substring(begin, begin + minlen); } }
http://www.jsqmd.com/news/955889/

相关文章:

  • 3大核心场景+5个实战技巧:Tinke深度解析NDS游戏资源解包与修改的终极方案
  • Python简历智能匹配工具包:知识图谱建模+DNN打分,含Django后台、训练模型与一键部署说明
  • 5分钟免费汉化Axure RP:中文界面快速切换完整指南
  • qt开发新手福音:用快马ai生成带讲解注释的第一个gui程序
  • 5分钟快速上手:FF14国际服终极中文补丁完全指南
  • XMCVE-钓鱼邮件
  • 如何在Windows上快速使用WinCDEmu:新手完整指南
  • 2026济南黄金回收门店实拍:从进门到收款,5家店服务全记录 - 商业快讯早知道
  • VCC、VDD、VSS:从历史起源到PCB实战的电源网络设计指南
  • 抖音下载器终极指南:快速批量获取无水印视频的完整解决方案
  • 分块切断语义?哈佛InSemRAG解决了,速度快4倍
  • 2026年邯郸黄金回收白银回收铂金回收变卖,5 家靠谱贵金属门店实地测评汇总 - 中业金奢再生回收中心
  • STM32串口字符画:从图像处理到终端显示的嵌入式实践
  • Spark推荐系统踩坑实录:ALS调参、冷启动与实时推荐的那些事儿
  • 小米智能家居接入HomeAssistant终极指南:免费实现全屋自动化控制
  • 终极Flameshot截图工具完全指南:从零基础到专业标注
  • 自制STC单片机USB下载器:兼容3.3V/5V与RS232的稳定下载方案
  • 2026年滁州黄金回收白银回收铂金回收金条回收高口碑 5 家线下门店实地测评整理 - 信誉隆金银铂奢回收
  • 如何永久保存QQ空间记忆:GetQzonehistory的完整备份指南
  • 深入PL端:AXI GPIO软核与Zynq PS端硬核GPIO,到底该怎么选?
  • Veo 2动态色调映射失效?4大隐藏设置陷阱,92%用户至今未察觉,立即自查!
  • 2026年郑州GEO优化服务商 5家机构实力对比 - 资讯快报
  • 2026年保定市民高频选择的5家实体黄金回收白银回收铂金回收门店实地测评整理 - 中安检金银铂钻回收
  • 2026年阜新本地人常去的 5 家黄金回收白银回收铂金回收实体店实地测评汇总 - 诚金汇钻回收公司
  • 指纹识别数据集终极指南:快速获取高质量指纹数据
  • 不止于点灯:用Zynq AXI GPIO中断实现一个简易‘反应测试仪’(附完整SDK工程)
  • [智能体-272]:词向量 vs 文本向量 对比详解
  • 终极AMD处理器调试工具:SMUDebugTool完整使用指南
  • 2026年新疆直营旅行社怎么选?疆都国旅破解强制购物与信息不对称困局 - 优质企业观察收录
  • 如何轻松下载喜马拉雅VIP音频?XMly-Downloader-Qt5完整使用指南