【滑动窗口】【map】LeetCode:76最小覆盖子串

作者推荐

【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

本文涉及知识点

滑动窗口

题目

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。
示例 2:
输入:s = “a”, t = “a”
输出:“a”
解释:整个字符串 s 是最小覆盖子串。
示例 3:
输入: s = “a”, t = “aa”
输出: “”
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
参数范围
m == s.length
n == t.length
1 <= m, n <= 105
s 和 t 由英文字母组成

滑动窗口

** 时间复杂度** : O(n+m)。两层循环,分别枚举子数组起点和终点[i,right),由于right不归0,所以总时间复杂度是O(n)。

CContain

m_mNeedCharCount记录了t中各字符的数量,m_mHasCharCount记录了枚举的子串各字符的数量。m_iNotSameCharCount 记录了m_mHasCharCount有多少个字符的数量少于m_mNeedCharCount。m_iNotSameCharCount为0,表示此子串符合题意。

增加前ch的数量符合题意增加后ch的数量符合题意
增加前ch的数量不符合题意增加后ch的数量不符合题意
增加前ch的数量不符合题意增加后ch的数量符合题意
增加前ch的数量符合题意增加后ch的数量不符合题意

iAdd可以为1或-1
将m_iNotSameCharCount改名m_iLessCharCount更符合题意。

滑动窗口

CContain 记录[i,right1),让它记录[i,right1+1),只需要将s[right1]加进去就可以了。
CContain 记录[i,right1),让它记录[i+1,right1),只需要减去s[i]就可以了。
[i,right) 是符合题意的最小值,也就是[i,right-1)不符合题意,[i+1,right-1)也必定不符合题意。所以无需尝试[i+1,right-1)。即right无需归0(复位)。

代码

核心代码

class CContain
{
public:CContain(const string& t){for (const auto& ch : t){m_mNeedCharCount[ch]++;}m_iNotSameCharCount = m_mNeedCharCount.size();}void Add(const char& ch,int iAdd){if (m_mNeedCharCount.count(ch)&&(m_mHasCharCount[ch] >= m_mNeedCharCount[ch] )){m_iNotSameCharCount++;}m_mHasCharCount[ch] += iAdd;if (m_mNeedCharCount.count(ch) && (m_mHasCharCount[ch] >= m_mNeedCharCount[ch])){m_iNotSameCharCount--;}}bool IsAllContain(){return 0 == m_iNotSameCharCount;}
protected:std::unordered_map<char, int> m_mNeedCharCount, m_mHasCharCount;int m_iNotSameCharCount = 0;
};
class Solution {
public:string minWindow(string s, string t) {CContain test(t);int iMaxLen = INT_MAX;int iPos =0;for (int i = 0, right = 0; i < s.length(); i++){for(;(right < s.length())&&(!test.IsAllContain());right++){test.Add(s[right],1);}if (test.IsAllContain()){if (right - i < iMaxLen){iMaxLen = right - i;iPos = i;}}test.Add(s[i], -1);}if (INT_MAX == iMaxLen){iMaxLen = 0;}return s.substr(iPos, iMaxLen);}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}
int main()
{string s,t;{Solution sln;s = "a", t = "a";auto res = sln.minWindow(s, t);Assert(std::string("a"), res);}{Solution sln;s = "ADOBECODEBANC", t = "ABC";auto res = sln.minWindow(s, t);Assert(std::string("BANC"), res);}{Solution sln;s = "a", t = "aa";auto res = sln.minWindow(s, t);Assert(std::string(""), res);}{Solution sln;s = "bbaac", t = "aba";auto res = sln.minWindow(s, t);Assert(std::string("baa"), res);}}

2023年4月版

class Solution {
public:
string minWindow(string s, string t) {
if (s.length() < t.length())
{
return “”;
}
std::unordered_map<char,int> setLess, setMore;
for (const char& ch : t)
{
setLess[ch]++;
}
int iRetIndex = -1;
int iRetLen = INT_MAX;
int iBeginIndex = 0;
string strRet;
for (int i = 0 ; i < s.length(); i++)
{
DelOrAdd(setLess, setMore, s[i]);
while (0 == setLess.size())
{
const int iLen = i - iBeginIndex + 1;
if (iLen < iRetLen)
{
iRetIndex = iBeginIndex;
iRetLen = iLen;
}
DelOrAdd(setMore, setLess, s[iBeginIndex]);
iBeginIndex++;
}

	}return (-1==iRetIndex)? "" : s.substr(iRetIndex,iRetLen);
}
void DelOrAdd(std::unordered_map<char, int>& del, std::unordered_map<char, int>& more, const char& ch)
{auto it = del.find(ch);if (del.end() == it){more[ch]++;}else if (it->second > 1){del[ch]--;}else {del.erase(ch);}}

};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法C++ 实现。

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

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

相关文章

根据DCT特征训练CNN

记录一次改代码的挣扎经历&#xff1a; 看了几篇关于DCT频域的深度模型文献&#xff0c;尤其是21年FcaNet&#xff1a;基于DCT 的attention model&#xff0c;咱就是说想试试将我模型的输入改为分组的DCT系数&#xff0c;然后就开始下面的波折了。 第一次尝试&#xf…

深入解析 Flink CDC 增量快照读取机制

一、Flink-CDC 1.x 痛点 Flink CDC 1.x 使用 Debezium 引擎集成来实现数据采集&#xff0c;支持全量加增量模式&#xff0c;确保数据的一致性。然而&#xff0c;这种集成存在一些痛点需要注意&#xff1a; 一致性通过加锁保证&#xff1a;在保证数据一致性时&#xff0c;Debez…

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…

如何配置TLSv1.2版本的ssl

1、tomcat配置TLSv1.2版本的ssl 如下图所示&#xff0c;打开tomcat\conf\server.xml文件&#xff0c;进行如下配置&#xff1a; 注意&#xff1a;需要将申请的tomcat版本的ssl认证文件&#xff0c;如server.jks存放到tomcat\conf\ssl_file\目录下。 <Connector port"1…

Linux介绍、安装、常见命令

Linux介绍 Linux是一种开源的操作系统&#xff0c;其内核由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年开始开发。与其他常见的操作系统如Windows和Mac OS不同&#xff0c;Linux是一个开放、自由的系统&#xff0c;可以免费使用、修改和分发。 Linux的核心特…

企业级实战项目:基于 pycaret 自动化预测公司是否破产

本文系数据挖掘实战系列文章&#xff0c;我跟大家分享一个数据挖掘实战&#xff0c;与以往的数据实战不同的是&#xff0c;用自动机器学习方法完成模型构建与调优部分工作&#xff0c;深入理解由此带来的便利与效果。 1. Introduction 本文是一篇数据挖掘实战案例&#xff0c;…

uniapp APP应用程序iOS没有上架到苹果应用商店如何整包更新?

随着移动互联网的快速发展&#xff0c;uni-app 作为一种跨平台开发框架&#xff0c;受到了广泛欢迎。然而&#xff0c;有时候开发者可能会遇到一个问题&#xff1a;如何为已经发布到苹果应用商店的 uni-app APP 进行整包更新&#xff1f;尤其是当应用还没有上架到苹果应用商店时…

nodejs进阶

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别&#xff1a;二、需要牢记的npm命令2.1 npm init2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.…

深信服技术认证“SCSA-S”划重点:文件上传与解析漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

从AMI镜像恢复AWS Amazon Linux 2实例碰到的VNC服务以及Chrome浏览器无法启动的问题

文章目录 小结问题及解决VNC服务无法启动Chrome浏览器无法启动 参考 小结 将Amazon Linux 2保存为AMI (Amazon Machine Images)后&#xff0c;恢复成EC2 Instance (实例)后&#xff0c;VNC服务以及Chrome浏览器无法启动&#xff0c;进行了解决。 问题及解决 如果要将一个EC2…

treeview数据的保存和读取(以表格方式保存)

一个简单的treeivew&#xff0c;以表格方式保存比较简单&#xff0c;遍历所有节点&#xff0c;记录parentNode、node、data即可 parentiddataid002xx2001005xx5000003xx3001006xx6002007xx7001000xx0001001xx1-1004xx4007 如何将表格转为tree数据&#xff0c;代码如下&#xf…

数据结构-十大排序算法

数据结构十大排序算法 十大排序算法分别是直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、外部排序。 其中插入排序包括直接插入排序、折半插入排序、希尔排序&#xff1b;交换排序包括冒泡排序、快速排序&#xff1…

LSTM中文新闻分类源码详解

LSTM中文新闻分类 一、导包二、读取数据三、数据预处理1.分词、去掉停用词和数字、字母转换成小写等2.新闻文本标签数值化 三、创建词汇表/词典1.data.Field()2.空格切分等3.构建词汇表/词典使用训练集构建单词表&#xff0c;vectorsNone:没有使用预训练好的词向量,而是使用的是…

阿里云自建官方Docker仓库镜像提交拉取方法

文章目录 发布镜像到DockerHub发布镜像到自建Docker仓库(Harbor)修改配置文件在Linux服务器中登录Docker打TAGPUSH提交镜像PULL拉取镜像 发布镜像到阿里云容器服务在Linux服务器中登录DockerPUSH提交镜像PULL拉取镜像 发布镜像到DockerHub 本地我们镜像命名可能会不规范&#…

详解Keras3.0 Layer API: LSTM layer

LSTM layer 用于实现长短时记忆网络&#xff0c;它的主要作用是对序列数据进行建模和预测。 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;根据当前输入和上一个时间步的隐藏状态&#xff0c;计算遗忘门的值。遗忘门的作用是控制哪些信息应该被遗忘&#xff0c;哪些…

C++面试宝典第10题:绘制各种图形

题目 我们需要编写一个图形相关的应用程序,并处理大量图形(Shape)信息,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类。应用程序需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式作为示意)。 (1)请使用面…

华为——使用ACL限制内网主机访问外网网站示例

组网图形 图1 使用ACL限制内网主机访问外网网站示例 ACL简介配置注意事项组网需求配置思路操作步骤配置文件 ACL简介 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#…

大数据开发之Sqoop详细介绍

测试环境 CDH 6.3.1 Sqoop 1.4.7 一.Sqoop概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下&#xff0c;轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&…

IRIS、Cache系统类汉化

文章目录 系统类汉化简介标签说明汉化系统包说明效果展示类分类%Library包下的类重点类非重点类弃用类数据类型类工具类 使用说明 系统类汉化 简介 帮助小伙伴更加容易理解后台系统程序方法使用&#xff0c;降低代码的难度。符合本土化中文环境的开发和维护&#xff0c;有助于…

年底大厂今年发多少年终奖,怎么发(上)?

马上就2023年年底了&#xff0c;互联网大厂腾讯员工首先&#xff0c;发年终奖了&#xff0c;111354 元&#xff01; 腾讯的同学可以查一查了&#xff0c;应该发多少已经定下来了&#xff01;&#x1f44b; 除此之外&#xff0c;千寻找了很多的大厂的年终奖发放时间&#xff0c;…