力扣hot100:76.最小覆盖子串(滑动窗口)

        本题使用滑动窗口解决,用right表示滑动窗口的右边界,left表示滑动窗口的左边界。寻找可行解,我们可以这样约定滑动窗口的意义:right指针向右移动,是使得滑动窗口找到可行解。left指针向右移动是为了更新窗口使得其可以继续寻找下一个可行解。那么本题中滑动窗口的right指针移动是为了使得窗口内包含t的所有字符,而当已经包含了所有字符时,这就是一个可行解,我们移动left指针使之“不可行”,寻找下一个可行解。

        我们要定义一个集合来表示是否包含了t,由于本题是包含t 多于t是没关系的,我们可以定义一个vector用来记录数量,每个字符多于了t的数量才算对。我们当然也可以用map来记录数量,每个字符多于了t的数量才算对。但是用vector必须记录52个字符,而用map比较时跟t的字符数量有关。

本题也容易想到的是,既然s中只需要考察包含t的所有字符,那我们可以把s中的不在t中的字符都去掉,然后记录去掉之后的new_s的各个字符在s中的位置,这样我们只需要在new_s中寻找一个区间包含t即可。这样做会比不去掉快吗?

        去掉之后少了一次判断字符是否在t中(去掉时:预处理时扫描一次;不去掉时:left和right各扫描一次,所以只少了一次)

滑动窗口 vector:

保证左指针始终指向t中的元素,即让左指针指向的元素一定构成可行解的一部分。

class Solution {
public:bool cmp(vector<int> &s,vector<int> & t){//true表示全都包含了int i=0;while(i<s.size()){if(s[i]<t[i]) return false;++i;}return true;}string minWindow(string &s, string &t) {int len=INT_MAX,ansl=0,ansr=-1;string ans="";vector<int> cnt_t(52),cnt_s(52);unordered_map<char,int> Getval;for(char ch='a';ch<='z';++ch) {Getval[ch]=ch-'a';Getval[ch-'a'+'A']=ch-'a'+26;}for(auto &i:t) cnt_t[Getval[i]]+=1;int left=0,right=-1,s_len=s.size();while(right<s_len){while(left<s_len&&!cnt_t[Getval[s[left]]]) ++left;//left始终指向t中的元素if(left==s_len) break;while(right<s_len-1&&!cmp(cnt_s,cnt_t)){++right;if(cnt_t[Getval[s[right]]]) cnt_s[Getval[s[right]]]+=1;}if(right-left<len&&cmp(cnt_s,cnt_t)){len=right-left;ansl=left;ansr=right;}//窗口内包含所有t的字符cnt_s[Getval[s[left++]]]-=1;}if(ansl<=ansr) ans=s.substr(ansl,len+1);return ans;}
};

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

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

相关文章

【电梯节能】能量回馈设备【快问快答】系列(第一期)

No.1、节电率 小伍说 &#xff1a;电梯节能&#xff0c;节电率有多少&#xff1f; 523能源说 &#xff1a;根据电梯自身耗电情况&#xff0c;节能率高达 15% — 45% 。 No.2、节电原理 小伍说 &#xff1a;电梯节能&#xff0c;是啥【原理】啊&#xff1f; 523能源说 &#x…

2024年AI辅助研发:科技遇上创意,无限可能的绽放

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 随着人工智能技术的持续突破与深度融合&#xff0c;2024年AI辅助研发正以前所未有的速度和规模&#xff0c;引领着科技界和工业界…

PythonStudio 控件使用常用方式(十)TLabel和TlabelLink

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 Tlabel是最常用的控件&#xff0c…

超值体验:一些值得试用的免费云服务器

免费云服务器是指云服务商提供的可以免费试用的云服务器实例。这些服务器通常具有一定的计算、存储和网络资源&#xff0c;用户可以在试用期内免费使用&#xff0c;并体验云服务器的各项功能。免费试用期限一般为数天至数月不等&#xff0c;试用期结束后&#xff0c;用户可以选…

【Linux】iftop命令详解

目录 一、iftop简介 二、安装iftop命令 2.1 命令查看测试环境系统信息 2.2 查看iftop版本与命令帮助 三、iftop的基本使用 3.1 直接使用iftop命令 3.2 iftop的显示说明 3.3 指定监控某块网卡 3.4 显示某个网段进出封包流量 3.5 按照流量排序 3.6 过滤显示连接 3.7 …

【软件工程导论】——软工学绪论及传统软件工程(学习笔记)

&#x1f4d6; 前言&#xff1a;随着软件产业的发展&#xff0c;计算机应用逐步渗透到社会生活的各个角落&#xff0c;使各行各业都发生了很大的变化。这同时也促使人们对软件的品种、数量、功能和质量等提出了越来越高的要求。然而&#xff0c;软件的规模越大、越复杂&#xf…

Oracle VM VirtualBox 安装完Ubuntu系统后一直提示安装Ubuntu

是因为存储设置有问题&#xff0c;把Ubuntu镜像添加进去了,移除后重启虚拟机就不会提示了 以下是配置的移除后的界面。

基于springboot的大学生智能消费记账系统的设计与实现(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

手写分布式配置中心(五)整合springboot(不自动刷新的)

springboot中使用配置方式有四种&#xff0c;分别是environment、BeanDefinition、Value、ConfigurationProperties。具体的原理可以看我之前的一篇文章https://blog.csdn.net/cjc000/article/details/132800290。代码在https://gitee.com/summer-cat001/config-center 原理 …

凌鲨微应用开发流程

微应用开发流程 使用vite,nextjs等框架创建前端项目引入需要的api包通过调试界面进行调试 创建前端项目 vite yarn create vitenextjs yarn create next-app引入需要的api包 名称权限说明http跨域访问跨域http访问tauri提供的apilinksaas-minapp/api打开浏览器读本地文件…

0环PEB断链

在操作系统层面上&#xff0c;进程本质上就是一个结构体&#xff0c;当操作系统想要创建一个进程时&#xff0c;就分配一块内存&#xff0c;填入一个结构体&#xff0c;并为结构体中的每一项填充一些具体值。而这个结构体&#xff0c;就是EPROCESS 在0x088 偏移处有一个指针Act…

林业数据可视化新篇章:山海鲸软件看板设计心得

可视化看板作为一种直观、高效的数据展示工具&#xff0c;对于提升管理水平和决策效能具有重要意义。作为一名山海鲸可视化软件的资深用户&#xff0c;我深知其设计方面的强大实力和便捷性&#xff0c;同时由于其免费可视化编辑、免费私有化部署的特点&#xff0c;使我能自由探…