【滑动窗口】变种题目:leetcode76:最小覆盖子串

前言

滑动窗口是算法的数组部分中非常重要的一个内容,关于滑动窗口的题目,我已经发布过相关的变种题目文章,链接如下,欢迎访问:

【滑动窗口】相关题目分析讲解:leetcode209,leetcode904

如果你不了解什么是滑动窗口,推荐观看代码随想录的基础讲解视频:

拿下滑动窗口! | LeetCode 209 长度最小的子数组

了解完这些,我们便可以开始思考本题了。

题干

题目难度:困难
在这里插入图片描述
在这里插入图片描述

题目分析

题目给了2个字符串,分别是st,我们要在s中找到涵盖t中所有字符的子串

注意题目中的涵盖,并不意味着两个字符串要长得一模一样,完全匹配,而是其中包含了t存在的所有字符

通俗来讲就是,假如t中有abc三个字符,数量分别为2,3,1,那么s的子串中一定要包含2个a,3个b,1个c

根据这个思路,我们开始分析代码要怎么写。

同样的滑动窗口的方法,一个指针进行遍历,同时统计当前的子串,当它达到涵盖t的标准后,左指针再移动,缩小范围,同时更新子串,直到不符合条件,这时候右指针再继续遍历。

大致思路有了,我们要进一步思考,什么才是代表着子串涵盖t。

已知匹配并不是长得完全一样,通过字符串来存储匹配的方法是不合理的。

并且它们的字符的顺序也可以不相同,比如tabbcs的子串可以是babc

s的子串里还可以包含不存在于t中的字符,比如sbabec

这种情况下,我们不应该用字符串来进行比对,经过思考,我认为能够存储字符和字符的数量的最好的方式就是用Map的键值对存储

key来存储字符value存储它出现的次数

通过创建map实例target,将t中所有字符和它出现的数量进行存储,这样遍历一遍t后,我们就得到了t的所有信息。

那么我们该怎么用s来和它比对呢?

首先我们要知道,t中一共有多少个字符,也就是target.size(),可以得到字符的数量。

设立一个变量valid,记录窗口中字符达到标准的字符数量。(达到标准指的是它的数量等于或大于t中本字符出现的数量)

右指针遍历s,当遍历的字符在t中存在的时候,我们将这个字符存储在记录窗口字符情况的Map集合window里。当window存储的这个字符数量达到了target中存储的本字符的数量,valid++;

valid等于target.size()时,证明此时右指针已经挪动到了符合涵盖t字符的位置,这个时候可以开始移动左指针缩小窗口了,每次缩小都要保存当前的子串,当缩小到valid不符合条件的时候(某个字符数量不达标时),退出循环。

然后right继续移动,直到valid再次达标,这时候再继续缩小窗口,移动左指针… …

代码编写

题目的思路我们已经分析完了,接下来我们要开始代码的编写。

首先,我们要考虑题目的情况,找到s中涵盖t字符的子串,所以意味着s的长度得大于等于t,并且st不能够为空

        if (s == null || t == null || s.length() < t.length()) {return "";}

这样,所有不符合条件的情况已经被排除了,接下来进入到查找子串的环节。

为了方便存储,可以将st转化成为数组

        char[] chars=s.toCharArray();char[] chart=t.toCharArray();

按照分析出的思路,将t中所有的字符,和每个字符出现的数量存储在Map集合里。

        Map<Character, Integer> target = new HashMap<>();//存储t的字符和数量for (char c : chart) {target.put(c,target.getOrDefault(c,0)+1);}

接着,我们需要另一个Map集合存储滑动窗口的字符和数量(只存储匹配t中字符成功的,没匹配上的不存储,直接跳过就行)

       Map<Character, Integer> window = new HashMap<>();//存储s窗口的字符和数量

定义validleftright分别记录符合条件的字符数量和左右指针。
定义len存储子串的长度,方便进行匹配更新
定义start存储子串的起点,只有当len变小的时候才更新

完整代码

根据思路,完整代码如下:

class Solution {public String minWindow(String s, String t) {//如果s或t为空,直接返回if (s == null || t == null || s.length() < t.length()) {return "";}//转化字符串为数组char[] chars=s.toCharArray();char[] chart=t.toCharArray();Map<Character, Integer> target = new HashMap<>();//存储t的字符和数量for (char c : chart) {target.put(c,target.getOrDefault(c,0)+1);}Map<Character, Integer> window = new HashMap<>();//存储s窗口的字符和数量int valid=0;  //记录当前窗口中包含多少个t中的字符int left=0;  //子串左边界int right=0;  //子串右边界int len=chars.length+1;int start=0;  //最小子串起点while (right < s.length()) {char c = chars[right];//扩展窗口,增加右侧字符的计数if (target.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if (window.get(c).intValue() == target.get(c).intValue()) {valid++;}}right++;//判断窗口是否包含t中所有字符while (valid == target.size()) {//更新最小子串if ((right - left) < len) {len=right-left;start = left;}char d = chars[left];if (target.containsKey(d)) {if (window.get(d).intValue() == target.get(d).intValue()) {valid--;}window.put(d, window.get(d) - 1);}left++;}}//substring(beginIndex,endIndex)的意思是从beginIndex到endIndex之前结束,不包括endIndexreturn len==chars.length+1? "":s.substring(start,start+len);}
}

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

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

相关文章

蚁群算法(Ant Colony Optimization, ACO)

简介 蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种基于自然启发的优化算法&#xff0c;由意大利学者马可多里戈&#xff08;Marco Dorigo&#xff09;在1992年首次提出。它受自然界中蚂蚁觅食行为的启发&#xff0c;用于解决离散优化问题。 在自然界…

1-测试go-redis缓存数据

1-测试go-redis缓存数据 1.go-redis缓存数据测试效果 a.测试页面 测试页面&#xff1a;--这里使用 Postman 来做测试 http://127.0.0.1:8000/article/getone/3 http://127.0.0.1:8000/article/getone/4 http://127.0.0.1:8000/article/getone/5b.测试效果 查看终端&#xf…

计算机毕业设计SparkStreaming+Kafka图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

字符串的常用函数

目录 一、引入 二、13个字符串的常用函数 总结 一、引入 在C语言中&#xff0c;字符串被视为字符数组的序列&#xff0c;以空字符\0结尾。这个空字符不是数字0&#xff0c;而是一个特殊的控制字符&#xff0c;用于标记字符串的结束。例如&#xff0c;声明char name[7] {R,…

丹摩|重返丹摩(下)

目录 四.模型构建与训练 1.模型选择 (1). 机器学习模型 (2). 深度学习模型 (3). AutoML 功能 2.参数配置 (1). 模型参数 (2). 数据划分 (3). 超参数优化 3.模型训练与评估 (1). 训练模型 (2). 查看训练结果 (3). 模型评估 五.模型部署与应用 1.模型部署 (1). 直…

浪潮信息自动驾驶框架AutoDRRT 2.0,赋能高阶自动驾驶

随着自动驾驶技术的迅猛进步&#xff0c;BEVTransformer的感知模式为高阶自动驾驶带来了前所未有的精度、泛化能力和多模态融合效果&#xff0c;已成为众多顶尖汽车制造商的首选方案。然而&#xff0c;当前自动驾驶方案中的大模型算法参数规模剧增&#xff0c;对算力、数据IO及…

【电源专题】BUCK电源SW电压的平均值为什么等于输出电压?

在Buck电源测试过程中,我们会去测试SW开关节点的波形。那么从SW波形中我们能看出什么呢? 首先查看SW波形一般会看SW频率,通过SW波形的频率知道目前芯片的运行状态是什么。比如PSM还是PWM模式。 此外,还会看SW波形的占空比,通过占空比我们可以知道目前输出的状态是怎么样的…

微信分账系统供应链分润微信支付 (亲测源码)

搭建环境&#xff1a;nginxphp7.2mysql5.7 1.上传源码到网站根目录并解压 2.导入数据库文件到数据库 3.修改数据库链接文件/.env 4.设置运行目录为/public 5.伪静态设置成tp 6.后台地址&#xff1a;域名/zh9025.php 源码下载&#xff1a;https://download.csdn.net/down…

HTB:Buff[WriteUP]

目录 连接至HTB服务器并启动靶机 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放的端口进行脚本、服务扫描 使用curl分别访问靶机的两个端口 使用浏览器访问靶机8080端口页面 漏洞利用 使用searchsploit搜索该WebAPP 通过python2利用该EXP成功ge…

[UE5学习] 一、使用源代码安装UE5.4

一、简介 本文介绍了如何使用源代码安装编译UE5.4&#xff0c;并且新建简单的项目&#xff0c;打包成安卓平台下的apk安装包。 二、使用源代码安装UE5.4 注意事项&#xff1a; 请保证可以全程流畅地科学上网。请保证C盘具有充足的空间。请保证接下来安装下载的visual studi…

遗传算法(Genetic Algorithm, GA)

简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种基于自然选择和遗传机制的优化算法&#xff0c;由 John Holland 于20世纪70年代提出。它是一种模拟生物进化过程的启发式搜索算法&#xff0c;被广泛应用于函数优化、机器学习、调度问题等领域。 代码说明 …

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法&#xff0c;凭借其独特的结构和训练方式&#xff0c;在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用&#xff0c;深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

[Redis#0] iredis: linux上redis超好用的环境配置

目录 Features 特征 Install 安装 Pip Brew Linux的 Download Binary 下载 Binary Usage 用法 Using DSN 使用 DSN Change The Default Prompt更改默认提示 Configuration 配置 Keys Development 发展 Release Strategy 发布策略 Setup Environment 设置环境 De…

软件测试——性能测试概念篇

前言&#xff1a;在完成对web网页或者接口的功能测试后&#xff0c;我们还需要考虑性能方面的因素&#xff0c;在学习完性能测试后&#xff0c;目标是能够对个人编写的项目进行性能测试&#xff0c;找到性能不足的地方&#xff08;性能问题个人很难去解决&#xff0c;如&#x…

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&#xff0c;…

探索 .NET 9 控制台应用中的 LiteDB 异步 CRUD 操作

本文主要是使用异步方式&#xff0c;体验 litedb 基本的 crud 操作。 LiteDB 是一款轻量级、快速且免费的 .NET NoSQL 嵌入式数据库&#xff0c;专为小型本地应用程序设计。它以单一数据文件的形式提供服务&#xff0c;支持文档存储和查询功能&#xff0c;适用于桌面应用、移动…

AWS 新加坡EC2 VPS 性能、线路评测及免费注意事项

原文论坛给你更好的阅读讨论体验&#x1f490;&#xff1a; AWS 新加坡EC2 VPS 性能、线路评测及免费注意事项 - VPS - 波波论坛 引言 对于那些习惯薅“羊毛”的朋友来说&#xff0c; AWS 的 免费套餐 可能已经非常熟悉。这台vps是我用外币卡薅的免费的12个月的机器&#xf…

C++ASCII码表和字符操作

目录 1. 引言 2. ASCII码表 2.1 控制字符 2.2 可显示字符 3. 字符操作 3.1 记住几个字符规律 3.2 打印能够显示的ASCII码 3.3 字母大小写转换 3.4 数字转数字字符 1. 引言 在电子计算机中&#xff0c;只能识别由 0 和 1 组成的一串串的二进制数字&#xff0c;为了将人类…

git使用(二)

git使用&#xff08;二&#xff09; git常用基本操作命令git clonegit loggit remotegit statusgit addgit commitgit pushgit branchgit pull git常用基本操作命令 git clone 项目开发中项目负责人会在github上创建一个远程仓库&#xff0c;我们需要使用git clone将远程仓库…

密码学11

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…