【算法】滑动窗口——最小覆盖子串

本节博客是对“最小覆盖子串”题目由暴力求解到滑动窗口的思路解析,有需要借鉴即可。

目录

  • 1.题目
  • 2.滑动窗口解法
  • 3.总结

1.题目

题目链接:LINK
在这里插入图片描述
这个题目是困难难度,感觉是一个中等题目的感觉。

首先我肯定想到的是暴力求解的方法,大概就是下面这种思路:
在这里插入图片描述
在比较找出的子串是否满足条件时候,可以用有效字符的方法,比如下面代码的count计数。

class Solution {
public:
//暴力求解:string minWindow(string s, string t) {//定义一个哈希表,用来收集t的有关信息string ret = "";int hash_t[128] = {0};for(int i = 0; i < t.size(); i++){hash_t[t[i]]++;}int minlength = 0;for(int left = 0; left < s.size(); left++){int hash_s[128] = {0};int count = 0;for(int right = left; right < s.size(); right++){//进哈希表hash_s[s[right]]++;if(hash_s[s[right]] <= hash_t[s[right]])count++;//有效字符++//判断if(count == t.size() && (minlength==0 || minlength >= right - left + 1)){minlength = right - left + 1;//有结果就把这次的长度更新过来,下一次比较的时候用ret = s.substr(left, minlength);break;}}}return ret;}
};

count有效计数原理:
当我们进哈希数组时候,如果这个字符映射的数组值小于等于hash_t的对应数组,则就是需要的,那么count就++,反之则不是
同理,当我们出字符时候,也是这个道理。
在这里插入图片描述

2.滑动窗口解法

但是我们可以发现,left 和 right是可以不用回退一直向前的,这就满足双指针,滑动窗口算法的使用条件
在这里插入图片描述

所以,代码可以优化成下面代码:

class Solution {
public:string minWindow(string s, string t) {//统计t的有关信息int hash_t[128] = { 0 };int kinds = 0;for(auto ch : t){if(hash_t[ch]++ == 0)kinds++;}int start = -1;int length = INT_MAX;//统计s的有关信息int hash_s[128] = { 0 };for(int left = 0, right = 0, count = 0; right < s.size(); right++){//进窗口char in = s[right];hash_s[in]++;if(hash_s[in] == hash_t[in])count++;//判断while(count == kinds){//更新结果if(right - left + 1 < length){length = right - left + 1;start = left;}//出窗口char out = s[left];if(hash_s[out] == hash_t[out]) count--;hash_s[out]--;left++;}}if(start == -1)return "";else return s.substr(start, length);}
};

注:这个地方的count计数与暴力求解的计数区别是这里用的是字母种类个数。

3.总结

如果有前面“滑动窗口”的题目铺垫其实这道题并不难,需要用到count计数的优化以及滑动窗口的思想。


EOF

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

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

相关文章

C++:STL-string

前言 本文主要介绍STL六大组件中的容器之一&#xff1a;string&#xff0c;在学习C的过程中&#xff0c;我们要将C视为一个语言联邦&#xff08;摘录于Effective C条款一&#xff09;。如何理解这句话呢&#xff0c;我们学习C&#xff0c;可将其分为四个板块&#xff1b;分别为…

数据降维-主成分分析PCA

1.背景&#xff1a; 在以前计算能力还很弱的年代&#xff0c;我们要分析经济数据是一件很困难的事情&#xff0c;所以我们需要对指标特征进行降维&#xff1b; 2.数据降维的意义&#xff1a; 一般我们降维的特征数据彼此之间是存在一定的相关性的&#xff0c; 二维降至一维…

2024年区块链、信号处理与航空航天国际学术会议(ICBSPA 2024)

2024年区块链、信号处理与航空航天国际学术会议&#xff08;ICBSPA 2024) 2024 International Conference on Blockchain, Signal Processing, and Aerospace 一、【会议简介】 随着科技的飞速发展&#xff0c;区块链、信号处理与航空航天等领域的交叉融合正成为推动科技进步的…

【代码随想录】【动态规划】背包问题 - 完全背包

完全背包 模板&#xff1a;完全背包问题 问题描述 完全背包问题与01背包问题唯一的区别在于&#xff1a; 在01背包中&#xff1a;每个物品只有一个&#xff0c;要么放入背包&#xff0c;要么不放入背包在完全背包中&#xff1a;每个物品有无限多个&#xff0c;可以不放入背…

2d激光slam中的常用地图介绍

2d激光slam中最常用的是栅格地图&#xff0c;用于保存建图后的地图。实际应用中的栅格地图也有很多类型和不同用处&#xff0c;下面根据使用经验一一介绍。 局部子地图&#xff0c;由一系列小栅格地图组成&#xff0c;每个栅格地图负责记录保存局部轨迹&#xff0c;通常用三个局…

卓豪Zoho CRM怎么收费?多少钱一年?

卓豪Zoho CRM作为一款功能强大且高度可定制的企业级客户关系管理系统&#xff0c;其收费标准因版本不同而有所差异&#xff0c;旨在满足不同规模及需求的企业。Zoho CRM提供多种套餐选择&#xff0c;包括但不限于免费版、标准版、专业版、企业版以及旗舰版。每种版本都包含了核…

基于Springboot的大学生平时成绩量化管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的大学生平时成绩量化管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…

Docker Dockerfile如何编写?

Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 1.指令说明 FROM&#xff0c;构建镜像基于哪个镜像 MAINTAINER&#xff0c;镜像维护者姓名或邮箱地址 RUN&#xff0c;构建镜像时运行的指令 CMD&#xff0c;运行容器时执…

娱乐营销的新玩法:Kompas.ai如何让内容更加趣味化

在数字化时代&#xff0c;内容营销已成为品牌与消费者沟通的重要桥梁。然而&#xff0c;随着信息的爆炸式增长&#xff0c;用户的注意力越来越分散&#xff0c;传统的营销方式已经难以吸引用户的兴趣。在这种背景下&#xff0c;娱乐营销应运而生&#xff0c;它通过将娱乐元素融…

数据库和Redis数据不一致的问题

目录 1. 延迟双删策略 2. 使用消息队列&#xff08;MQ&#xff09; 3. 引入分布式锁 4. 先更新数据库&#xff0c;再删除缓存 5. 设置缓存过期时间 6. 使用Redis事务 7. 监控和报警机制 数据库和Redis数据不一致的问题&#xff0c;主要源于Redis和数据库的异步写入机制。…

【设计模式】桥接模式-学习记录

概念 桥接模式是一种结构型设计模式&#xff0c;其UML图像一座桥&#xff0c;通过抽象部分与实现部分分离&#xff0c;使它们可以独立变化&#xff0c;从而达到降低系统低耦合的目的。桥接模式只要目的是通过组合建立两个类之间的联系&#xff0c;而不是继承的方式。 基本结构…

华东政法大学公布2024《负面清单期刊目录》,附目录

近日&#xff0c;华东政法大学公布2024《负面清单期刊目录》&#xff0c;包括《齐齐哈尔大学学报(哲学社会科学版)》《景德镇学院学报(社科)》《九江学院学报(社科)》《北京印刷学院学报》《江西电力职业技术学院学报》《中国多媒体与网络教学学报》《吉林省教育学院学报》《开…

Poetry Camera照相机将照片转换成诗歌并打印出来;吴恩达新课程深入了解Mistral;科学研究AI小助手data-to-paper

✨ 1: Poetry Camera 将拍摄的照片转换成诗歌并打印出来 Poetry Camera——一个能够把它所见之物转化成诗歌并打印出来的相机。你在一个美丽的公园&#xff0c;或者是一个充满故事的老街道。只要用Poetry Camera拍下这一刻&#xff0c;它就能立刻给你一首关于这个场景的诗。 …

【JAVA进阶篇教学】第十五篇:Java中AQS讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十五篇&#xff1a;Java中AQS讲解。 在Java并发编程中&#xff0c;AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是一个重要的框架&#xff0c;用于实现同步器和锁的基础。它提供了一种灵活的方式来实现各种…

浏览器不兼容 replaceAll 方法问题解决

问题 在一些较旧版本的浏览器中可能会出现 replaceAll 方法不兼容&#xff0c;提示replaceAll 方法 undefined 的问题。浏览器版本兼容情况如下图所示&#xff1a; 解决 可以通过 replace 正则表达式 的方法来代替 replaceAll 方法&#xff1a; let str "我是一段文本…

CorelDRAW2024设计新境界,等你解锁!

CorelDRAW&#xff0c;这款由加拿大Corel公司开发的平面设计软件&#xff0c;自从1989年问世以来&#xff0c;就以其强大的功能和用户友好的界面&#xff0c;在全球设计师中享有极高的声誉。今天&#xff0c;我们要聊的主角是它的最新版本——CorelDRAW 2024。 CDR永久版安装包…

材料物理 笔记-8

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; ——…

从零学算法6

6. Z 字形变换 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H NA P L S I I GY I R之后&#xff0c;你的输出需要从左往右…

Python3 笔记:分支结构

Python 中选择结构&#xff1a;单分支选择结构、双分支选择结构、多分支选择结构。 1、if 语句是单分支选择结构&#xff0c;其语法形式如下&#xff1a; if 条件表达式: 语句块 如果条件表达式的值为真&#xff0c;即条件成立&#xff0c;语句块将被执行&#xff1b;否…

出租车计价器设计与实现(论文 + 源码)

关于java出租车计价器设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89304164 出租车计价器设计与实现 摘 要 在我国&#xff0c;出租车行业是八十年代初兴起的一项新兴行业&#xff0c;随着出租车的产生&#xff0c;计价器也就应运而生。但当时在全…