2.8滑动窗口专题:最小覆盖子串

1. 题目链接

LeetCode 76. 最小覆盖子串


2. 题目描述

给定字符串 st,要求找到 s最小的窗口,使得该窗口包含 t 的所有字符(包括出现次数)。若不存在,返回空字符串。
示例
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"(最短窗口包含 ABC,且长度最短)。


3. 示例分析

s = "ADOBECODEBANC", t = "ABC" 为例:

  1. 滑动窗口法:

    • right 移动到索引 5 时,窗口 "ADOBEC" 包含 ABC,记录长度为 6。
    • 继续移动 right 到索引 10,窗口缩小为 "BANC",长度为 4,更新为最终结果。
  2. 暴力枚举法:

    • 枚举所有子串,例如 [0,5][0,6][9,12],逐个检查是否包含 t 的所有字符。

4. 算法思路

滑动窗口法

  1. 哈希表统计
    • hash1 统计 t 中字符的出现次数。
    • hash2 统计当前窗口内字符的出现次数。
  2. 动态窗口调整
    • 右指针扩展:将字符加入窗口,若其出现次数等于 t 中的次数,增加有效计数 count
    • 左指针收缩:当窗口包含 t 的所有字符时,尝试缩小窗口并更新最小长度。
  3. 结果记录:每次窗口满足条件时,检查是否为最短窗口。

暴力枚举法

  • 枚举所有可能的子串起点 i 和终点 ji ≤ j),检查子串是否包含 t 的所有字符。

5. 边界条件与注意事项
  1. 字符重复性:窗口需满足 t 中字符的出现次数,而不仅是存在性。
    • 例如 t = "AA",窗口必须包含至少两个 A
  2. 无效输入:若 s 长度小于 t,直接返回空。
  3. 哈希表初始化:需覆盖所有 ASCII 字符(代码中使用 hash[128])。
  4. 最小窗口更新:需在每次窗口合法时实时更新,避免遗漏更优解。

6. 代码实现
class Solution {
public:string minWindow(string s, string t) {int ns = s.size(), nt = t.size();if (ns < nt) return "";int hash1[128] = {0}; // 统计t的字符频次int kinds = 0;        // t中不同字符的种类数for (char ch : t) {if (hash1[ch]++ == 0) kinds++;}int hash2[128] = {0}; // 窗口内字符频次int left = 0, count = 0, min_len = INT_MAX, begin = -1;for (int right = 0; right < ns; right++) {char in_ch = s[right];hash2[in_ch]++; // 当窗口内该字符频次首次满足t的要求时,增加countif (hash2[in_ch] == hash1[in_ch]) count++;// 当窗口包含t的所有字符时,尝试缩小窗口while (count == kinds) {// 更新最小窗口if (right - left + 1 < min_len) {min_len = right - left + 1;begin = left;}// 移除左边界字符char out_ch = s[left++];// 若移除后导致频次不足,减少countif (hash2[out_ch]-- == hash1[out_ch]) count--;}}return (begin == -1) ? "" : s.substr(begin, min_len);}
};

在这里插入图片描述


7. 暴力枚举法与滑动窗口法对比图表

对比维度暴力枚举法滑动窗口法
核心思想枚举所有子串,逐一检查是否包含 t 的所有字符。动态维护窗口,仅在窗口不满足条件时扩展,满足条件时收缩以寻找最优解。
时间复杂度O(n² * m)(n为s长度,m为t长度,需遍历所有子串并检查字符频次)。O(n)(每个字符被左右指针各访问一次)。
空间复杂度O(1)(使用固定大小的哈希表)。O(1)(哈希表大小为128,常数空间)。
实现方式双重循环枚举子串,内层循环统计字符频次。单层循环扩展右指针,内层循环收缩左指针。
适用场景极小规模数据(n ≤ 100)。大规模数据(n ≤ 1e5)。
优点逻辑简单,直接穷举所有可能性。时间复杂度最优,适用于大规模输入。
缺点数据规模大时性能极差(n=1e4时需1e8次操作)。需精确维护哈希表状态(如count增减逻辑)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…

cyberstrikelab lab2

lab2 重生之我是渗透测试工程师&#xff0c;被公司派遣去测试某网络的安全性。你的目标是成功获取所有服务器的权限&#xff0c;以评估网络安全状况。 先扫一下 ​ ​ 192.168.10.10 ​ ​ 骑士cms 先找后台路径 http://192.168.10.10:808/index.php?madmin&cind…

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

PTA7-13 统计工龄

题目描述 给定公司 n 名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。 输入格式: 输入首先给出正整数 n&#xff08;≤105&#xff09;&#xff0c;即员工总人数&#xff1b;随后给出 n 个整数&#xff0c;即每个员工的工龄&#xff0c;范围在 [0, 50]。…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Servle…

电子电气架构 --- 汽车电子硬件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

使用 Homebrew 安装 OpenJDK 并配置环境变量

在 macOS 上使用 Homebrew 安装 OpenJDK 是一种简单而高效的方式。本文将使用 Homebrew 安装 OpenJDK&#xff0c;并设置环境变量以便 Java 能够正确运行。 1. 安装 Homebrew 首先&#xff0c;确保你的 macOS 系统已经安装了 Homebrew。如果没有安装&#xff0c;可以通过以下…

Java集合简单理解

Java 的集合框架&#xff08;Java Collections Framework, JCF&#xff09;是 Java 中用于存储和操作数据结构的核心库&#xff0c;提供了丰富的接口和实现类&#xff0c;用于处理不同类型的集合数据。以下是详细的介绍&#xff1a; 一、集合框架的体系结构 Java 集合主要分为…

群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)

摘要 旗鱼优化算法&#xff08;Sailfish Optimizer, SFO&#xff09;是一种模拟旗鱼&#xff08;Sailfish&#xff09;和沙丁鱼&#xff08;Sardine&#xff09;之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为&#xff0c;以及沙丁鱼群的逃逸与…

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

蓝桥与力扣刷题(蓝桥 星期计算)

题目&#xff1a;已知今天是星期六&#xff0c;请问 20^22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日。 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&#xff1…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

小程序网络大文件缓存方案

分享一个小程序网络大图加载慢的解决方案 用到的相关api getSavedFileList 获取已保存的文件列表&#xff1b;getStorageSync 获取本地缓存&#xff1b;downloadFile 下载网络图片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 将数据储存到小程序本地缓存&…

软考系统架构师 — 3 操作系统

目录 3.1 考点分析 3.1 操作系统概述 3.1.1 操作系统的功能 3.1.2 操作系统的分类 3.1.3 嵌入式操作系统主要特点 3.2 进程 3.2.1 进程的组成和状态 3.2.2 前趋图与进程资源图&#xff08;重点&#xff09; 3.2.3 进程同步与互斥 3.2.4 进程调度 3.2.5 死锁 3.3 线…

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…