当前位置: 首页 > 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.rkmt.cn/news/1467520.html

相关文章:

  • videomae-large-finetuned-kinetics高级技巧:自定义视频分类任务的迁移学习终极指南
  • Python简历智能匹配工具包:知识图谱建模+DNN打分,含Django后台、训练模型与一键部署说明
  • 分块切断语义?哈佛InSemRAG解决了,速度快4倍
  • 2026济南黄金回收门店实拍:从进门到收款,5家店服务全记录 - 商业快讯早知道
  • 抖音下载器终极指南:快速批量获取无水印视频的完整解决方案
  • XMCVE-钓鱼邮件
  • 如何在Windows上快速使用WinCDEmu:新手完整指南
  • 2026年保定市民高频选择的5家实体黄金回收白银回收铂金回收门店实地测评整理 - 中安检金银铂钻回收
  • 2026年滁州黄金回收白银回收铂金回收金条回收高口碑 5 家线下门店实地测评整理 - 信誉隆金银铂奢回收
  • Spark推荐系统踩坑实录:ALS调参、冷启动与实时推荐的那些事儿
  • 小米智能家居接入HomeAssistant终极指南:免费实现全屋自动化控制
  • 2026年郑州GEO优化服务商 5家机构实力对比 - 资讯快报
  • 深入PL端:AXI GPIO软核与Zynq PS端硬核GPIO,到底该怎么选?
  • 2026年阜新本地人常去的 5 家黄金回收白银回收铂金回收实体店实地测评汇总 - 诚金汇钻回收公司
  • 指纹识别数据集终极指南:快速获取高质量指纹数据
  • 如何轻松下载喜马拉雅VIP音频?XMly-Downloader-Qt5完整使用指南
  • 2026年昌吉黄金回收白银回收铂金回收金条回收高口碑 5 家线下门店实地测评整理 - 信誉隆金银铂奢回收
  • 2026年母婴品牌职业打假应对时舆情处置危机公关常见的洗白陷阱
  • 2026佛山黄金回收完全手册:从选店到收款,这篇全说清了 - 商业快讯早知道
  • 2026年安康黄金回收白银回收铂金回收金条回收高口碑 5 家线下门店实地测评整理 - 信誉隆金银铂奢回收
  • 工业5.0时代数据-服务-知识协同治理与TRISK框架解析
  • 2026北京理工科美国留学中介测评TOP5:科研背景提升哪家强? - 品牌2026
  • Android Studio中文界面终极指南:3步快速切换完整教程
  • 【Claude 3.5发布前夜警告】:当前版本5大不可修复设计缺陷,仅剩72小时窗口期适配
  • MZmine 3终极指南:5步掌握开源质谱数据分析全流程
  • 别再手动敲空格了!Typora、VS Code、Obsidian里Markdown缩进的正确姿势
  • 论文写不出学术味?学长安利这几个AI论文工具
  • 金蝶软件代理前几名哪家好?头部厂商格局解析 - 资讯纵览
  • STM32定时器多通道独立输入捕获配置详解与避坑指南
  • AntiDupl.NET:开源智能图片去重工具,彻底清理你的数字相册