【面试经典150 | 滑动窗口】最小覆盖子串

news2024/12/29 2:01:42

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:滑动窗口
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【滑动窗口】【字符串】


题目来源

面试经典150 | 76. 最小覆盖子串


题目解读

返回字符串 s 中覆盖所有 t 字符串的所有子串,如果 s 中不存在覆盖 t 所有字符的子串,则返回空字符串 ""

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

解题思路

方法一:滑动窗口

使用滑动窗口来解决本题。首先需要判断在每个滑窗内子串是否覆盖了 t,如果覆盖了,再判断是否可以缩短滑窗的大小。

我们使用一个变量 cnt 来判断滑窗是否覆盖了 t 字符串。 cnt 表示滑窗内覆盖的 t 字符串中的字符个数,比如当前滑窗内的字符串为 "abc"t = acf,则 cnt = 2;初始化 cnt = 0。如果 cnt = s.size(),则滑窗覆盖了 t 字符串。

我们先使用数组 chars 记录 t 中每个字符出现的数量,滑窗内每新增一个 t 字符串中的字符 s[r],则 --chars[s[r]],如果 chars[s[r]] >= 0,则 ++cnt

当滑窗覆盖了 t 之后,更新最小覆盖窗口的左端点位置 min_l 和 最小覆盖窗口的大小 min_size(维护这个变量是为了得到最小覆盖字符串),右移滑窗的左端点(滑窗移除字符),迭代更新最小覆盖字符串窗口。在迭代中,如果滑窗移除的字符是 t 字符串中的字符并且 ++chars[s[l]] > 0,则 --cnt

最后,如果 min_size > s.size(),则表示 s 中没有覆盖 t 的子串,直接返回 "";否则,根据 min_lmin_size 输出最小的覆盖子串。

实现代码

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int> chars(128, 0);
        vector<bool> flag(128, false);

        // 先统计T中的字符情况
        for(int i = 0; i < t.size(); ++i) {
            flag[t[i]] = true;
            ++chars[t[i]];
        }

        //移动滑动窗口,不断更改数据
        int cnt = 0;                    // 匹配的数量
        int l = 0;                      // 左端点
        int min_l = 0;                  // 最小覆盖窗口的左端点位置
        int min_size = s.size() + 1;    // 最小覆盖窗口的大小
        for(int r = 0; r < s.size(); ++r) {
            if(flag[s[r]]) {
                if(--chars[s[r]] >= 0) {
                    ++cnt;
                }

                while(cnt == t.size()) {
                    if(r - l + 1 < min_size) {
                        min_l = l;
                        min_size = r - l + 1;
                    }
                    if(flag[s[l]] && ++chars[s[l]] > 0) {
                        --cnt;
                    }
                    ++l;
                }
            }
        }
        return min_size > s.size() ? "" : s.substr(min_l, min_size);
    }
};

复杂度分析

时间复杂度:最坏情况下左右指针对 s 的每个元素各遍历一遍,哈希表中对 s 中的每个元素各插入、删除一次,对 t 中的元素各插入一次。每次检查是否可行会遍历整个 t 的哈希表,哈希表的大小与字符集的大小有关,设字符集大小为 ∑ \sum ,则渐进时间复杂度为 O ( ∑ ⋅ ∣ s ∣ + ∣ t ∣ ) O(\sum⋅∣s∣+∣t∣) O(s+t)

空间复杂度: O ( ∑ ) O(\sum) O() ∑ = 128 \sum = 128 =128,为记录出现的字符种类。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

26525-2022 精制氯化钴 学习记录

声明 本文是学习GB-T 26525-2022 精制氯化钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制氯化钴的要求、试验方法、检验规则及标志、标签、包装、运输、贮存。 本文件适用于精制氯化钴。 注&#xff1a;该产品主要用于…

ATA-P系列功率放大器——应用场景介绍

ATA-P系列功率放大器是一款理想的可放大交直流信号的功率放大器。最大输出功率可达1300Wp&#xff0c;可以驱动压电陶瓷片、叠堆型压电陶瓷、开环封装压电陶瓷以及纳米定位工作台等压电制动产品。电压增益数控可调&#xff0c;一键保存常用设置&#xff0c;提供了方便简洁的操作…

今天刷到一条有用的抖音---网站文档copy的解禁

有的时候在网上查找一些资料&#xff0c;发现些有用的东西的时候&#xff0c;兴高采烈的复制一下&#xff0c;然后网站弹出一个菜单让你付钱~~如下图&#xff1a; 此时&#xff0c;可以在该网页上&#xff0c;按F12&#xff0c;召唤出调试窗口&#xff0c;在事件监听器中&#…

亚马逊筋膜枪UL1647测试报告申请

筋膜枪&#xff0c;又称深层肌筋膜冲击仪&#xff0c;是一种通过高频冲击放松身体的软组织的软组织康复工具。[1]筋膜枪可理解为DMS&#xff08;电动深层肌肉刺激器&#xff09;的民用版本。使用时振动频率会发生变化&#xff0c;其基本功能与DMS相似。[2]筋膜枪的使用必须注意…

【AI视野·今日NLP 自然语言处理论文速览 第四十三期】Thu, 28 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 28 Sep 2023 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Cross-Modal Multi-Tasking for Speech-to-Text Translation via Hard Parameter Sharing Authors Brian Yan,…

安卓手机使用油猴脚本教程

下载支持油猴脚本的浏览器 请现在应用商店下载 x浏览器 &#xff0c;如果自己手机应用商店没有的话&#xff0c;可以在官网下载安装包&#xff0c;然后手动安装。 x浏览器官网 应用图标&#xff1a; 导入油猴脚本 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…

Cannot download sources

问题 Swagger的相关包&#xff0c;没法看到注释&#xff1b;源码也下载不了&#xff0c;会报下面的错误。 解决办法是&#xff0c;通过maven&#xff0c;重新下载jar包。 报错 Cannot download sources Sources not found for: io.swagger.core.v3:swagger-annotations:2.2.…

java导出word(含图片、表格)

1.pom 引入 <!--word报告生成依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupI…

kafka环境搭建以及基本原理

kafka最先是作为日志数据采集&#xff0c;后用于消息传递&#xff0c;kafka能承担tb级别数据存储&#xff0c;确保服务的可用性&#xff0c;允许少量数据的丢失 作为消息中间件就有异步、解耦、削峰三个作用 一、单机搭建 单机ip&#xff1a;192.168.64.133 下载地址&#…

npm ,yarn 更换使用国内镜像源,淘宝源

背景 文章首发地址 在平时开发当中&#xff0c;我们经常会使用 Npm&#xff0c;yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的&#xff0c;如果没有梯子的话。下载速度会特别慢。那有没有方法解决呢&#xff1f; 其实是有的&#xff0c;设置国内镜像即可&#x…

PHP8的静态变量和方法-PHP8知识详解

我们在上一课程讲到了public、private、protected这3个关键字&#xff0c;今天我们来讲解static关键字&#xff0c;明天再讲解final关键字。 如果不想通过创建对象来调用变量或方法&#xff0c;则可以将该变量或方法创建为静态变量或方法&#xff0c;也就是在变量或方法的前面…

Docker学习_镜像和容器篇

简介 Docker是一种容器化的技术&#xff0c;可以实现在一台宿主机电脑上运行多个不同的容器&#xff0c;每个容器之间都相互独立&#xff0c;具有完整的一套文件&#xff0c;网络和端口。 可以将其理解为一种虚拟机技术&#xff0c;只不过和VMware等虚拟化技术不同&#xff0…

Day05-循环高级和数组

循环高级 1.无限循环 概念&#xff1a; 又叫死循环。循环一直停不下来。 for格式&#xff1a; for(;;){System.out.println("循环执行一直在打印内容"); } 解释&#xff1a; 初始化语句可以空着不写&#xff0c;表示循环之前不定义任何的控制变量。 条件判断…

C++标准模板(STL)- 输入/输出操纵符-(std::setbase,std::setfill)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

深信服云桌面用户忘记密码后的处理

深信服云桌面用户忘记了密码&#xff0c;分两种情况&#xff0c;一个是忘记了登录深信服云桌面的密码&#xff0c;另外一个是忘记了进入操作系统的密码。 一、忘记了登录深信服云桌面的密码 登录虚拟桌面接入管理系统界面&#xff0c;在用户管理中选择用户后&#xff0c;点击后…

C++ | 计算几何:判断点与多边形的关系

在屏幕坐标上有一个多边形&#xff0c;给定一个点&#xff0c;判断该点和多边形的关系。 例如在下图中&#xff0c;点A位于多边形内&#xff0c;点B位于多边形外&#xff0c;点C位于多边形上。 注意: 1.屏幕坐标系中&#xff0c;x轴从左往右为正方向&#xff0c;y轴从上到下为…

10分钟巩固多线程基础

10分钟巩固多线程基础 前言 多线程是并发编程的基础&#xff0c;本篇文章就来聊聊多线程 我们先聊聊概念&#xff0c;比如进程与线程&#xff0c;串行、并行与并发 再去聊聊线程的状态、优先级、同步、通信、终止等知识 进程与线程 什么是进程&#xff1f; 操作系统将资…

外汇天眼:假投资平台COINPAYEX非法吸金2158万,项目小组循线破获诈团据点

近年来加密货币投资愈来愈普及&#xff0c;许多人们开始关注并投入这个市场&#xff0c;期望能够获得高额报酬&#xff0c;甚至达到财务自由的目标。 但需要注意的是&#xff0c;市面上充斥各种黑平台&#xff0c;一不小心恐怕蒙受极大的损失。 9/12&#xff0c;警政署刑事警察…

c语言 - 实现每隔1秒向文件中写入当前系统时间

实现思路 主要是通过库函数和结构体获取当前系统时间&#xff08;年月日和时分秒&#xff09;保存到变量里&#xff0c;然后通过格式化输出函数将当前系统时间输出到文件中去。 但是需要注意的是题目要求每隔 1 s对系统时间进行输出&#xff0c;所以需要加入 sleep()函数进行调…

windows 环境变量设置

方法一&#xff1a;打开环境变量设置窗口&#xff08;或者cmd 执行sysdm.cpl命令&#xff09; 方法二&#xff1a; powershell执行如下命令&#xff0c;注意修改<要增加的环境变量值>值为要设置的环境变量值 [Environment]::SetEnvironmentVariable("PATH", $E…