leetcode面试经典150题——33 最小覆盖子串(滑动窗口)

题目: 最小覆盖子串

描述
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。

leetcode链接

方法一:滑动窗口
题目解读:该题与32题(详细见上一篇讲解32串联所有单词的子串)很相似,唯一不同的是本题所求子串中不仅包含t中的所有字符,还可以包含其他的字符,因此所求子串和t是一个包含的关系,而32题所求子串和t的字符是一一对应的,没有多余的字符,即子串的长度等于t的长度,而此题子串的长度大于等于t的长度。
求解:同样的我们利用32题的滑动窗口的方法,过程完全一致,唯一不同该题的窗口为动态长度的,即定义一个窗口,初始长度为0,然后判断当前窗口是否包含t中所有的字符,如果包含,那么记录该窗口的长度并且维护一个最小的满足条件的窗口长度,并且left指针右移,即缩小窗口的长度。如果不包含t中所有字符,那么right指针右移,即增大窗口,循序以上操作。
那么我们如何判断窗口是否包含t中的所有字符呢,我们考虑最佳时间复杂度的做法,即为定义2个unordered_map,分别为map1和map2,map1记录中字母的出现次数,map2记录窗口字母的出现次数,然后判断map1和map2,如果map1中所有的关键字的值都小于等于map2,那么可以认为窗口包含了t中所有字符。这里在存储map2的时候,只需要存储在map1中出现过的关键字,含义即为只存储t中出现过的字符到map中,这样做节省了空间的消耗。
时间复杂度:o(Cn,+m) 时间包括指针的移动(窗口的枚举),为o(n),和判断窗口是否包含t中字符的时间,即为哈希表的查询,设哈希表的大小为C,那么时间复杂度为o(Cn),还有初始把t中所有字符插入哈希表的时间,为o(m),所以总时间复杂度为o(Cn+m)。

过程如图所示,阴影部分为当前窗口,其中红色字体的字母为存储在哈希表中的元素,窗口内其它元素不进行存储
在这里插入图片描述

发现此时窗口不包含t中的所有元素,那么right指针右移,此时窗口包含t中所有的元素,记录此时的子串长度
在这里插入图片描述
然后left指针右移
在这里插入图片描述

class Solution {
public:unordered_map<char,int> smap,tmap;string minWindow(string s, string t) {int n = s.size(),m = t.size();int len = INT_MAX, ansL = -1, ansR = -1;for(auto &c : t){tmap[c]++;//存储t中单词出现的次数}int left = 0,right = -1;while(right<n){//窗口右移if(tmap.find(s[++right])!=tmap.end()){//统计在t中出现过的字符的个数smap[s[right]]++;}while(check()&&left<=right){//如果窗口中包含s所有字符,那么left指针右边移if (right - left + 1 < len) {len = right - left + 1;ansL = left;}if(tmap.find(s[left])!=tmap.end()){smap[s[left]]--;}left++;}}return ansL == -1 ? string() : s.substr(ansL, len);}bool check(){for(auto &p:tmap){if(smap[p.first]<p.second){return false;}}return true;}
};

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

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

相关文章

【三维重建】摄像机标定(张正友相机标定法)

摄像机标定的目的是为了求解摄像机的内、外参数 求解投影矩阵M 通过建立特殊的场景&#xff0c;我们能过得到多对世界坐标和对应图像坐标 根据摄像机几何可知 &#xff1a; &#xff0c;M是一个3*4的矩阵&#xff0c;令 通过一对点可以得到两个方程组&#xff0c;M中一共有11个…

SpringBoot : ch09 整合Redis

前言 当你的应用程序需要一个快速、可扩展的内存数据库时&#xff0c;Redis是一个非常流行的选择。通过将Redis与Spring Boot集成&#xff0c;你可以轻松地利用Redis的功能&#xff0c;例如缓存、会话存储和消息队列等&#xff0c;从而提升应用程序的性能和可伸缩性。 在本教…

mongodb查询数据库集合的基础命令

基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式&#xff1a; 一种是进入mongo后通过mongo的函数关闭&#xff1b; use admin db.shutdownServer()一种是通过mongod关闭&#xff1b; mongod --s…

Selenium 学习(0.14)——软件测试之测试用例设计方法——因果图法2【基本步骤及案例】

1、因果图法的基本步骤 2、案例分析 1&#xff09;分析原因和结果 2&#xff09;关联原因和结果 投入1元5角或2元&#xff0c;按下“可乐”&#xff0c;送出“可乐”【暂时忽略找零】 投入2元&#xff0c;按下“可乐”或“雪碧”。找零5角&#xff0c;送出“可乐”或“雪…

软件测试测试文档编写

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a;   测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要…

vscode注释插件「koroFileHeader」

前言 在vscode上进行前端开发&#xff0c;有几个流行的注释插件&#xff1a; Better CommentsTodo TreekoroFileHeaderDocument ThisAuto Comment Blocks 在上面的插件中我选择 koroFileHeader 做推荐&#xff0c;原因一是使用人数比较多&#xff08;最多的是 Better Commen…

NAS-DIP: Learning Deep Image Prior with Neural Architecture Search

NAS-DIP: 用神经结构搜索学习深度图像先验 论文链接&#xff1a;https://arxiv.org/abs/2008.11713 项目链接&#xff1a;https://github.com/YunChunChen/NAS-DIP-pytorch Abstract 最近的研究表明&#xff0c;深度卷积神经网络的结构可以用作解决各种逆图像恢复任务的结构…

使用vue脚手架创建vue项目

Vue是一个流行的前端框架&#xff0c;可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具&#xff0c;它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目&#xff0c;并选择一些常用的功能和插件…

Java开源ETL工具-Kettle

一、背景 公司有个基于Kettle二次开发产品主要定位是做一些数据ETL的工作, 所谓的ETL就是针对数据进行抽取、转换以及加载的过程&#xff0c;说白了就是怎么对原始数据进行清洗&#xff0c;最后拿到我们需要的、符合规范的、有价值的数据进行存储或者分析的过程。 一般处理ETL的…

【从浅识到熟知Linux】基本指令之man、uname和bc

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;干完饭写篇博客放松一下。 文章前言&#xff1a;本文介绍man、uname和bc指令用法并给出示例和截图。 文章目录 man基本语法功能选项无选项…

人工智能入门,什么是AlphaGo式搜索?

AlphaGo式搜索是一种搜索算法&#xff0c;它是由DeepMind开发的AlphaGo团队在开发AlphaGo程序时使用的搜索策略。 AlphaGo是一个基于人工智能的围棋程序&#xff0c;它在2016年击败了世界冠军柯洁&#xff0c;引起了广泛的关注。 AlphaGo式搜索的核心思想是使用蒙特卡洛树搜索…

Docker:深入解析Nexus技术构建可靠的软件仓库管理系统

1、简述 在现代软件开发中&#xff0c;有效的软件仓库管理是确保项目成功的关键一环。Nexus Repository Manager作为一种流行的仓库管理系统&#xff0c;为开发人员提供了强大的工具&#xff0c;用于存储、检索和管理软件构建。本文将深入解析Nexus技术&#xff0c;探讨其关键…

OMP: Error #15: Initializing libiomp5md.dll

问题描述 在conda虚拟环境运行程序时&#xff0c;出现以下的错误&#xff1a; 问题原因 anaconda的环境下存在两个libiomp5md.dll文件。 解决方法 一、在代码上加上限制&#xff08;每次都得加&#xff09; import os os.environ[KMP_DUPLICATE_LIB_OK]True 这种方法解决不…

【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++字符串逆序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…

sql注入靶场

第一关&#xff1a; 输入&#xff1a;http://127.0.0.1/sqli-labs-master/Less-1/?id1 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27-- 使用--来闭合单引号&#xff0c;证明此处存在字符型的SQL注入。 使用order …

Unity之NetCode多人网络游戏联机对战教程(10)--玩家动画同步

文章目录 前言NetworkAnimation服务端权威客户端权威 前言 这次的动画同步与位置同步&#xff0c;可以说实现思路是一样的&#xff0c;代码相似度也非常高 NetworkAnimation 如果直接挂载这个脚本只有Host&#xff08;服务端&#xff09;才可以同步&#xff0c;Client是没有…

通过火狐Firefox浏览器在设备间留言、传递备注消息

如果多台设备间没有都安装微信、飞书这种可以通过文件传输助手备注消息的APP&#xff0c;那么可通过火狐浏览器在设备间留言。 原理&#xff1a;火狐支持把当前设备的一个浏览器标签页发送到其他设备 那么我们只需要把要留言的文本记录到一个网页&#xff0c;然后发送到其他设…

快速开发出一个公司网站

问题描述&#xff1a;参加一个创业活动&#xff0c;小组要求做一个公司网站&#xff0c;简单介绍一下自己公司的业务。需要快速完成。 问题解决&#xff1a;从网上找一个网站模板&#xff0c;类似于做PPT&#xff0c;搭建一个网站即可。 这里推荐的是京美建站、wordpress、he…

springboot云HIS医院信息综合管理平台源码

满足基层医院机构各类业务需要的健康云HIS系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;能与公卫、PACS等各类外部系统融合&#xff0c;实现多…