力扣017_最小覆盖字串题解----C++

news/2025/2/1 6:18:05/

题目描述

  1. 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。、
  2. 如何判断当前的窗口包含所有 t 所需的字符呢?我们可以用一个哈希表表示 t 中所有的字符以及它们的个数,用一个哈希表动态维护窗口中所有的字符以及它们的个数,如果这个动态表中包含 t 的哈希表中的所有字符,并且对应的个数都大于或等于t 的哈希表中各个字符的个数,那么当前的窗口是「可行」的。

假设这是我们对应的是s和t

创建unordered_map<char,int> hs,ht

我们定义两个指针,作为遍历s的窗口,再定义一个cnt作为窗口内的有效字符。

遍历s,用for循环,每循环一次r,把r指向的值存入到hs中,

 unordered_map<char,int> hs,ht;string ans;for(auto &c:t) ht[c]++; int l=0,r=0,cnt=0; //l为窗口的左边界,r为窗口的右边界for(;r<s.size();r++){ //每次循环右边界右移一次hs[s[r]]++;

此时有两种情况,当hs[s[r]]<=ht[s[r]] ,cnt++。

如果hs[s[l]]>ht[s[l]],说明hs里面已经存在两个相同的有效值了,如下图

ht:ABA,cnt=2 因为我们要找的是最小覆盖字串,且包含了A有效字符,所有这个时候我们的左窗口右移,并且减去一个A 

while(hs[s[l]]>ht[s[l]]){ //这个语句会右移左边界,比如这个边界字符不在t里,hs[s[l]]--;           //或者符合条件的边界值在后面又增加了一个且和左边界值相同,那么就可以右移左边界l++;

一次次的循环如下 

当我们的cnt 有效字符等于t.size()的时候,也就是这个窗口包含了t字符串的所有。

 if(cnt==t.size()){ //有效字符等于字符串t的长度,我们可以放入答案;if(ans.empty()||r-l+1<ans.size()) ans=s.substr(l,r-l+1);或者对比前窗口的大小和当前的大小,然后决定是否更新ans。}

如下即为全部的代码

class Solution {
public:string minWindow(string s, string t) {unordered_map<char,int> hs,ht;string ans;for(auto &c:t) ht[c]++; int l=0,r=0,cnt=0; //l为窗口的左边界,r为窗口的右边界for(;r<s.size();r++){ //每次循环右边界右移一次hs[s[r]]++;if(hs[s[r]]<=ht[s[r]]) cnt++; //在找到第一个符合条件的窗口后,这个语句不会再运行了。//ps.该语句的作用是统计窗口内的有效字符//左边界右移                              while(hs[s[l]]>ht[s[l]]){ //这个语句会右移左边界,比如这个边界字符不在t里,hs[s[l]]--;           //或者符合条件的边界值在后面又增加了一个且和左边界值相同,那么就可以右移左边界l++;}if(cnt==t.size()){ //有效字符等于字符串t的长度,我们可以放入答案;或者对比前窗口的大小和当前的大小,然后决定是否更新ans。if(ans.empty()||r-l+1<ans.size()) ans=s.substr(l,r-l+1); 对比前窗口的大小和当前的大小,然后决定是否更新ans。}}return ans;}
};


http://www.ppmy.cn/news/1568357.html

相关文章

Vue.js 比较 Composition API 和 Options API

Vue.js 比较 Composition API 和 Options API 今天我们来聊聊 Vue.js 中的两种编写组件的方式&#xff1a;Options API 和 Composition API。如果你对这两者的区别感到困惑&#xff0c;或者不知道在什么情况下选择哪种方式&#xff0c;那么这篇文章将为你解答。 Options API …

JavaScript - Web APIs(上)

Web API 介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff0c;ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECM…

linux环境变量配置文件区别 /etc/profile和~/.bash_profile

在 Linux 系统中&#xff0c;环境变量可以定义用户会话的行为&#xff0c;而这些变量的加载和配置通常涉及多个文件&#xff0c;如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明&#xff1a; 文章目录 1. 环境变量…

B站吴恩达机器学习笔记

机器学习视频地址&#xff1a; 4.5 线性回归中的梯度下降_哔哩哔哩_bilibili 损失函数学习地址&#xff1a; 损失函数选择 选凸函数的话&#xff0c;会收敛到全局最小值。证明凸函数用Hessian矩阵。凸函数定义&#xff1a;两点连线比线上所有点都大。 batch理解&#xff1…

【面试】【详解】计算机网络(TCP 三次握手,四次挥手)

一、计算机网络详解 &#xff08;一&#xff09;计算机网络概述 定义&#xff1a;计算机网络是通过传输介质将多台计算机连接起来&#xff0c;以实现数据通信和资源共享的系统。 功能&#xff1a; (1) 数据通信&#xff1a;实现不同设备之间的数据传输。 (2) 资源共享&#…

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

MySQL(高级特性篇) 13 章——事务基础知识

一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 &#xff08;1&#xff09;存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务能看出在MySQL中&#xff0c;只有InnoDB是支持事务的 &#x…

RabbitMQ 匿名队列详解

在小组代码 Review 时&#xff0c;讨论到了 RabbitMQ 的匿名队列&#xff0c;于是去网上查了下关于匿名队列的内容&#xff0c;并记录下来。 匿名队列是一种特殊的临时队列&#xff0c;在消息传递过程中有着独特的用途&#xff0c;匿名队列也被称为临时队列&#xff0c;它没有…