LeetCode 76. 最小覆盖子串 滑动窗口框架

双指针的特殊应用:滑动窗口

代码

题目链接:https://leetcode.cn/problems/minimum-window-substring/description/
不说废话,直接贴代码:

static string minWindow(string s, string t) {// need记录需要匹配的字符串t中每个字符及出现的次数// window记录s中维护的窗口中对应need字符出现的次数(记录其他字符没有用)unordered_map<char, int> need, window;for (char c: t) {need[c]++;}int left = 0, right = 0;// valid记录window中已经满足(个数)要求的字符个数,如果一个字符在window中出现的次数等于need,那么该值加1int valid = 0;// 记录最小覆盖字串的起始索引及长度int start = 0, len = INT32_MAX;while (right < s.size()) {// 把right位置的元素移入窗口,并扩大窗口char c = s[right];right++;// 如果当前新增的字符属于需要的字符,对window的记录进行更新if (need.count(c)) {window[c]++;// 如果更新后该字符的个数已经达到need要求,进行记录if (window[c] == need[c]) {valid++;}}// 如果当前window中所有字符的个数都满足了need要求,说明左窗口可以收缩,以寻找更短的符合长度while (valid == need.size()) {// 如果当前新的符合条件的window长度小于之前记录的长度,就更新记录if (right - left < len) {start = left;len = right - left;}char d = s[left];// 缩小窗口left++;if (need.count(d)) {if (window[d] == need[d]) {valid--;}window[d]--;}}}return len == INT32_MAX ? "" : s.substr(start, len);
}

解题框架

关键点:

对于滑动窗口window

  • 1.每次移入元素,都要考察
    (1)该元素是否是need中的
    (2)如果是,增加后它的个数是否满足了need的要求
    如果所有元素的个数都满足了need要求,说明可以收缩左边界,以寻求更短的符合长度。
  • 2.每次移出元素,都要考察
    (1)该元素是否是need中的
    (2)如果是,减少后它的个数是否就不满足need要求了
    2.1 如果移出元素后,窗口所有元素的个数不满足need要求了,说明不需要收缩左边界了,需要继续向右扩张边界以寻找新的元素用来满足need要求。
    2.2 如果移出元素后,窗口所有元素的个数依然满足need要求,说明还可以继续收缩,一直收缩到不满足为止。

框架

  解题框架:while(right<s.size())1.移入右侧元素,扩大窗口2.对新移入的元素进行判断(1)它是need中的吗?如果是,对window中该元素的个数记录进行更新(1.1)该元素的增加,是否导致它的个数满足了need的要求?如果是,valid+13.如果window中所有元素的个数都满足了need要求(valid==need.size()),说明可以对左边界进行收缩,以寻求更短的符合长度3.1对【最短覆盖子串】的起始位置和长度进行更新3.2移出左侧元素,缩小窗口3.3对移出的元素进行判断(1)它是need中的吗?如果是(1.1)该元素的减少是否导致其个数不再符合need要求?(因为可能该字符的个数超过need要求,导致减少一个以后依然满足)如果不再满足,valid-1对window中该元素的个数记录进行更新(window记录需要先进行上一步的判断,所以判断完以后再更新)

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

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

相关文章

❤ Mac IDEA使用并运行项目

❤ IDEA导入项目并运行 Mac IDEA使用 (1) 仓库导入 通过获取giett仓库包的url&#xff0c;在idea中导入项目 在gitee里获取项目的ur打开idea&#xff0c;点击 File->new->Project from Version Control (2) 创建数据库ry并导入数据脚本 &#xff08;3&#xff09;修改配…

华为配置Smart Link主备备份示例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff0c;它通过监控设备的上行接口…

npm私有源构建项目下载依赖报错

Jenkins构建项目报错&#xff0c;依赖找不到 Error: Couldnt find any versions for "babel/helper-module-imports" that matches "^7.22.15"at MessageError.ExtendableBuiltin (/data1/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util当中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加载这个log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

高性能和多级高可用,云原生数据库 GaiaDB 架构设计解析

1 云原生数据库和 GaiaDB 目前&#xff0c;云原生数据库已经被各行各业大规模投入到实际生产中&#xff0c;最终的目标都是「单机 分布式一体化」。但在演进路线上&#xff0c;当前主要有两个略有不同的路径。 一种是各大公有云厂商选择的优先保证上云兼容性的路线。它基于存…

考研真题数据结构

【2021年山西大学真题】将二叉树中所有非终端结点的左右子树交换位置&#xff0c;可以得到原二叉树的 镜像二叉树&#xff0c;如图。假设二叉树的存储形式为&#xff08;lchild&#xff0c;data&#xff0c;rchild&#xff09;&#xff0c;给出求镜像二叉树的算法: &#xff0…

Sql Server Management Studio连接Mysql

目标 已知mysql连接参数&#xff08;地址和用户&#xff09;&#xff0c;期望通过Microsoft Sql Server Management Studio &#xff08;以下简称MSSSMS&#xff09;连接Mysql&#xff0c;在MSSSMS中直接查询或修改Mysql中的数据。 下载MySql Connector/ODBC并安装&#xff0c…

使用poi-tl填充word模板,并转化为pdf输出

后端 依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version> </dependency>Word版本 Word版本填充代码 // 培训详情HashMap<String, Object> textMap new Ha…

maven环境搭建

maven历史版本下载&#xff1a;https://archive.apache.org/dist/maven/ 新建系统变量编辑Path&#xff0c;添加bin目录mvn -v测试查看版本号conf目录下新建repository文件夹&#xff0c;作为本地仓库 settings.xml <?xml version"1.0" encoding"UTF-8&…

2312d,d语言来绑定C++和rust

原文 各编译语言相同概念 1,按可重用函数拆分代码. 2,由源码中的函数名生成的串来标识函数.如,g为void foo()生成_Z3foov的标识.此串总是是可重现的;如,Linux上的Clang和GCC都遵循ItaniumCABI约定来装饰函数名. 3,在内存中的特定位置存储该函数的所有参数,然后用调用或等效指…

gitee配置

注册配置gitee Gitee官网 进入官网之后&#xff0c;有账号直接登录&#xff0c;没有账号注册一个新的账号 下载安装git客户端 官网地址 下载完成&#xff0c;一路直接点击安装直接安装成功 检查是否安装成功 鼠标留在桌面–>右击–>出现Git GUI Here/Git Bash Her…

windows系统nodeJs报错node-sass npm ERR! command failed

报错信息 npm WARN deprecated request2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated tar2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asa…

国科大通信原理复习

CH4-信源的数字化 26. 信源编码的基本方法和分类 27. 无失真编码和有失真编码的区别 无失真编码能够完全一模一样的恢复到原信号。 有失真编码则不行。 28. 信息量和熵的定义 29. 离散信源的最大熵定理 n表示所有符号的种类&#xff0c;比如对于二进制码字&#xff0c;Rbit对…

云计算ACP认证考试题库0-100

0001.单选题:阿里云的云盾会检查通过公共互联网登录云服务器ECS的来源IP,登录方式包括SSH和远程桌面,当来自某个IP的登录请求出现多次密码错误的情况时,会发出”ECS遭遇密码暴力破解”的报警,当收到这个报警后,最安全的处理方法应该是。 A.通知自己业务平台的所有用户立即修改…

基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期神经网络的新鲜度等级预测

目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 粒子群算法原理 SVM应用实例,基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期神经网络的新鲜度等级预测 代码 结果分析 展望 完整代码:基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期…

SpringBoot+线程池实现高频调用http接口并多线程解析json数据

场景 SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)&#xff1a; SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)-CSDN博客 Java中ExecutorService线程池的使用(Runnable和Callable多…

MindOpt APL:一款适合优化问题数学建模的编程语言

什么是建模语言 建模语言是一种描述信息或模型的编程语言&#xff0c;在运筹优化领域&#xff0c;一般是指代数建模语言。 比如要写一个线性规划问题的建模和求解&#xff0c;可以采用C、Python、Java等通用编程语言来实现计算机编程&#xff08;码代码&#xff09;&#xff0…

nodejs微信小程序+python+PHP的黄山旅游景点购票系统设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 28 章:圣杯 = 专家 + ChatGPT 的协同作用

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 28 章&#xff1a;圣杯 专家 ChatGPT 的协同作用 ​ 这就像是从 ChatGPT 或其他生成式人工智能中获得高质量答案的圣杯。因为光知道怎么问&#xff08;提示工程技术&#xff09;还不够&#xff0c;还要知…

harmonyOS开发技巧(二)——沉浸式以及状态栏高

1. 设置沉浸式&#xff1a;win.setWindowLayoutFullScreen(true); 2. 获取状态栏的高&#xff1a;win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)以及win.on(avoidAreaChange, (data) > {})。 import UIAbility from ohos.app.ability.UIAbility; import wind…