当前位置: 首页 > news >正文

力扣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;}
};

相关文章:

  • Android UI:ViewTree中的操作
  • 惬意上手Redis
  • 使用Anaconda创建Python指定版本的虚拟环境
  • 富格林:揭秘应对暗箱操作正规技巧
  • 【Linux进阶之路】HTTP协议
  • ARTS Week 20
  • BJFU|大数据基础考前速记(含考试大纲与复习笔记)
  • Pygame教程07:键盘常量+键盘事件的2种捕捉方式
  • SQL: 触发器/存储过程/游标的操作
  • System类 --java学习笔记
  • 拍立淘API:助力电商企业快速定位目标客户
  • websocket 使用示例
  • 实现QT中qDebug()的日志重定向
  • GPT-prompt大全
  • 【DevOps基础篇】容器化架构基础设施监控方案
  • 「面试题」如何实现一个圣杯布局?
  • 4. 路由到控制器 - Laravel从零开始教程
  • Cookie 在前端中的实践
  • isset在php5.6-和php7.0+的一些差异
  • mongodb--安装和初步使用教程
  • Quartz初级教程
  • Terraform入门 - 1. 安装Terraform
  • Vue 动态创建 component
  • Web设计流程优化:网页效果图设计新思路
  • 程序员最讨厌的9句话,你可有补充?
  • 对象管理器(defineProperty)学习笔记
  • 简析gRPC client 连接管理
  • 排序(1):冒泡排序
  • 我感觉这是史上最牛的防sql注入方法类
  • 异常机制详解
  • Java数据解析之JSON
  • 选择阿里云数据库HBase版十大理由
  • ​io --- 处理流的核心工具​
  • ​如何防止网络攻击?
  • # C++之functional库用法整理
  • $L^p$ 调和函数恒为零
  • (2015)JS ES6 必知的十个 特性
  • (3)nginx 配置(nginx.conf)
  • (30)数组元素和与数字和的绝对差
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (超详细)语音信号处理之特征提取
  • (蓝桥杯每日一题)love
  • (六)vue-router+UI组件库
  • (十六)串口UART
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)Thymeleaf用法——Thymeleaf简介
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)德国人的记事本
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net 生成二级域名
  • .NET 使用 XPath 来读写 XML 文件
  • .NET导入Excel数据
  • .net生成的类,跨工程调用显示注释