力扣 76. 最小覆盖子串

news2024/12/23 12:27:30

一、题目

在这里插入图片描述

二、 示例

在这里插入图片描述

三、提示

在这里插入图片描述

四、 思路与代码实现

1. 思路

  • 本题, 套用的是滑动窗口算法模板;
  • 初始化左右窗口边界指针(要方便源串取值) left = 0, right = 0, 为什么这样初始化?
    • 若设置窗口索引为左闭右闭区间, 则这样初始化时,窗口为windows[0, 0], 即初始化时就包含了一个元素;
    • 若设置窗口索引为左开右开区间, 则这样初始化时,窗口为windows(0, 0), 那么当right像右滑动的一格时候, 窗口windows(0, 1)仍然没有元素, 此时right 指针要多滑动一位才有包含;
    • 以上两种都不方便处理边界;
    • 左闭右开区间,当初始化时, 窗口为windows[0, 0), 此时窗口中包含一个元素windows[0],方便处理边界;
  • 使用unordered_map<char, int>容器来定义windows(窗口)与need, 其中 need 记录 T中字符出现的次数, 而windows则记录窗口中字符的出现次数;
  • 接着先滑动 right 指针来扩大窗口, 其中若窗口中的字符与need中的字符匹配(数量上也要匹配),则val++(val代表窗口中满足 need 条件的字符个数 例如, T 为ABC, 而滑动窗口包含为 BNBAC);
  • 收缩窗口的时机为, 当 val == need.size() 即窗口中包含的字符满足了need条件, 此时窗口已经完全覆盖了子串 T;在这里做子串的更新, 若 right - left 这一范围比之前的 len 长度更小则长度len更新, 且让 start = left;
  • 返回子串为: return len == INT_MAX_LEN ? "" : s.substr(start, len);

2. 代码

class Solution {
public:
    string minWindow(string s, string t) {
        const int INT_MAX_LEN = 1e6;
        // 窗口, 需求 容器
        unordered_map<char, int> windows, need;
        // 初始化 t 是要求涵盖的子串
        for (char c : t) need[c]++;
        int left = 0;
        int right = 0;
        // 左闭右开区间
        int val = 0;
        int start = 0; // 更新待返回的子串
        int s_len = s.size();
        int len = INT_MAX_LEN;  // 待返回的子串长度
        // 套用窗口模板
        while (right < s_len) {
            // 待移入窗口的字符
            char c = s[right];
            // 窗口滑动
            right++;
            // 窗口内数据的更新
            if (need.count(c)) {
                windows[c]++;   // 移入窗口
                if (windows[c] == need[c]) {
                    val++;
                }
            }

            // 判断是否收缩窗口
            while (val == need.size()) {
                // 在收缩前收缩前更新子串
                if (right - left < len) {
                    start = left;
                    len = right - left;
                }
                char d = s[left];
                // 收缩窗口
                left++;
                // 进行窗口内数据的一系列更新
                if (need.count(d)) {
                    if (windows[d] == need[d]) {
                        val--;
                    }
                    windows[d]--;
                }
                
            }
        }
        // 返回子串
        return len == INT_MAX_LEN ? "" : s.substr(start, len);
    }
};

3. 关键思考

  • 滑动窗口算法的关键:
    • 1、什么时候应该扩大窗口?
    • 2、什么时候应该缩小窗口?
    • 3、什么时候应该更新答案?

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

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

相关文章

英语学习打卡day8

2023.1.29 1. affluent adj.富裕的&#xff0c;富足的&#xff0c;流畅的n.支流&#xff0c;富人 flu交通流动、发达-流畅的 affluent society affluent neighborhood 2.conception 概念&#xff0c;观念;受孕&#xff0c;怀孕 conceive v.构思&#xff0c;设想;使受孕&…

【Redis | 黑马点评】短信登陆

文章目录项目概述项目前置准备短信登陆基于Session实现登录流程实现发送短信验证码功能实现短信验证码登录和注册功能实现登录校验拦截器隐藏用户敏感信息集群的Session共享问题基于Redis实现共享Session登录登录拦截器的优化项目概述 短信登录 这一块我们会使用redis共享sess…

ExecutorService线程池

文章目录ExecutorService线程池1 ExecutorService API 介绍1.1 api1.1.1 awaitTermination 方法1.1.2 invokeAll 方法1.1.3 invokeAny方法1.1.4 shutdown 方法1.1.5 shutdownNow方法1.1.6 isShutdown方法1.1.7 submit方法1.1.8 isTerminated方法ExecutorService线程池 1 Execu…

Makefile学习笔记(一)

背景 最近在看ATF代码的时候&#xff0c;想要编译下&#xff0c;实施起来遇到一些问题&#xff0c;其中makefile有些命令&#xff0c;语法不是很清晰&#xff0c;故希望重新系统学习下。学习主要参考跟我一起写Makefile-陈皓.pdf。 第一部分、概述 makefile解决的问题&#…

周期矩形波的傅里叶级数展开(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 当脉冲信号周期不变&#xff0c;脉冲宽度变大时&#xff0c;相邻谱线间隔不变&#xff0c;频谱包络线的零点频率逐渐变小&…

git查看分支、创建分支、合并分支

一、查看的git命令如下&#xff1a; git branch 列出本地已经存在的分支&#xff0c;并且当前分支会用*标记 git branch -r 查看远程版本库的分支列表 git branch -a 查看所有分支列表&#xff08;包括本地和远程&#xff0c;remotes/开头的表示远程分支&#xff09; git bran…

9、位和逗号的运算符与表达式

目录 一、位逻辑运算符与位逻辑表达式 1. 位逻辑运算符 2. 位逻辑表达式 二、逗号运算符与逗号表达式 一、位逻辑运算符与位逻辑表达式 1. 位逻辑运算符 位逻辑运算符包括位逻辑与、位逻辑或、位逻辑非和取补 注意&#xff1a;表中除了最后一个运算符是单目运算符外&…

PC 性能自动化工具技术方案及说明

● 需求背景 Kim PC端在每一个版本的迭代过程中&#xff0c;由于各版本的功能改动较多&#xff0c;为了避免在发布新版本时性能不会出现“大跳水”的情况&#xff0c;需要针对每一个版本进行性能测试。由于人工手动测试所需时间较长&#xff0c;且存在参数不准确、时间不可控等…

基于Java+SpringBoot+vue+element驾校管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

详解vue组件(属性、事件和插槽)

一、属性 1.自定义属性props 可以得出props 可以显示定义一个或一个以上的数据&#xff0c;对于接收的数据&#xff0c;可以是各种数据类型&#xff0c;同样也可以传递一个函数。通过一般属性实现父向子通信&#xff1b;通过函数属性实现子向父通信 2.inheritAttrs 3. data与…

十、顺序存储二叉树、线索化二叉树

1、二叉树顺序存储 1.1 特点 顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n1第n个元素的右子节点为2*n2第n个元素的父节点为(n-1)/2 n&#xff1a;表示二叉树中的第几个元素&#xff08;按0开始编号&#xff09;&#xff0c;也可以理解为n为数组下标。 1.2、基本…

力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串…

Apache两个解析漏洞复现及防御方法

一、多后缀解析漏洞 形成原因&#xff1a; 配置apache时&#xff0c;对于apache配置不熟练&#xff0c;配置命令不清楚&#xff0c;在配置PHP文件处理程序时&#xff0c;配置命令存在问题&#xff1a;位于漏洞环境目录的 conf/docker-php.conf里的配置命令&#xff08;AddHand…

路由策略实验(华为)

题目&#xff1a; 思路&#xff1a; 为完成实验达成目的&#xff0c;需要明确两个区域内的协议&#xff0c;并且要避免造成环路&#xff0c;故需要改变r3-r1,r3-r4两边的优先级&#xff0c;可以避免造成环路&#xff0c;并且需要达到选路最优&#xff0c;设置匹配规则&#xff…

【机器学习】逻辑回归(实战)

逻辑回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、绘制 sigmoid 函数&#xff1a;σ(z)11e−z\sigma(z)\frac{1}{1e^{-z}}σ(z)1e−z1​三、查看鸢尾花数据集1、加载 iris 数据集并查看2、设计二分…

[Java]Maven学习笔记(尚硅谷2022)

文章目录&#x1f97d; Maven概述&#x1f30a; Maven的功能&#x1f30a; Maven简介&#x1f4a6; 构建&#x1f4a6; 依赖&#x1f4a6; Maven 的工作机制&#x1f97d; Maven核心程序解压和配置&#x1f30a; Maven 核心程序解压与配置&#x1f4a6; 下载&#x1f4a6; 解压…

电脑本地安装不同版本MySQL

本地已经安装了mysql5.7版本&#xff0c;想测试mysql8版本的用法&#xff0c;想在一台电脑同时配置不同版本的mysql在不同端口号&#xff0c;看起来简单&#xff0c;实现起来其实挺多坑的&#xff0c;总结下实战经验和大家分享下 一、下载安装 下载地址 二、配置 1、解压缩…

word标签功能:如何快速制作批量产品贴纸标签

在日常生活中&#xff0c;在商店购物时&#xff0c;经常可以看到&#xff0c;商品架上放有产品贴纸标签&#xff0c;用于消费者识别产品价格、日期或者组合成分等。在日常办公中&#xff0c;在办公用品或仓库物料上&#xff0c;同样也能看到贴纸标签&#xff0c;用于物品的分类…

Go语言安装

1. 介绍 Go语言是一门编译型语言。Go的语法接近C语言&#xff0c;但对于变量的声明有所不同。Go支持垃圾回收功能。 C/C&#xff1a;C/C语言直接编译成机器码&#xff0c;不需要执行环境&#xff0c;直接执行在操作系统上&#xff1b; Java&#xff1a;Java会先编译成字节码.c…

es6对象中的简写形式

对象属性简写 let name ww; let age 18; // es5写法 let es5 {name: name,age: age, }; // es6写法 let es6 {name,age }函数简写 let obj {es5: function () {}, // es5写法es6() {} // es6写法&#xff0c;省略 :function }计算属性名 let name ww; let age 18 let o…