当前位置: 首页 > news >正文

双指针:滑动窗口

题目描述

  • 给定两个字符串 S 和 T,求 S 中包含 T 所有字符的最短连续子字符串的长度,同时要求时间复杂度不得超过 O(n)。

输入输出样例

  • 输入是两个字符串 S 和 T,输出是一个 S 字符串的子串。样例如下:
    在这个样例中, S 中同时包含一个 A、一个 B、一个 C 的最短子字符串是“BANC”。
Input: S = “ADOBECODEBANC”, T = “ABC”
Output: “BANC”

算法步骤

  • 本题使用滑动窗口求解,即两个指针 l 和 r 都是从最左端向最右端移动,且 l 的位置一定在 r 的左边或重合。注意本题虽然在 for 循环里出现了一个 while 循环,但是因为 while 循环负责移动 l 指针,且 l 只会从左到右移动一次,因此总时间复杂度仍然是 O(n)。
  • 先统计 T 中的各字符是否出现及数量,用 flag[i]代表代表ACII值为i的字符是否出现, chars [i] 表示ACII值为i的字符在T中出现的次数,也可以用于表示当前窗口中缺少的字符的数量。
  • cnt 表示当前窗口中的 包含T中字符 的数量,由于后续代码中 cnt 的变化都和 chars 有关(每次chars 变化后,cnt才变换),则可直接用 cnt 的值和 T的大小比较,判断滑动窗口中是否都包含了T中的字符。左指针 l 和右指针 r 开始默认指向字符串最左边的第一个元素。初始化滑动窗口的最小值为整个S的长度+1,即表示整个S字符串都不匹配。
  • 接下来的 for 外层循环 负责移动窗口的 右指针r 来遍历字符串 S,若 S[r] 不是T中的字符,则不做处理, r 往右遍历;若 S[r] 是T中的字符,则进行以下处理:
    • 判断 当前窗口中是否还缺少字符 S[r] ,若缺少,则 cnt++。
    • 若 cnt 的值等于 T 的大小,则表示当前滑动窗口中已经包含了 T 中所有字符,然后进入while 内层循环,负责移动左指针 l:将 左指针l 右移,在不影响结果的情况收缩窗口,以获得最短子字符串。
      • 若当前滑窗长度 < 最小长度,则刷新最小长度和左指针 l。
      • 若 左指针指向的字符 S[l] 属于T中的字符,且++chars[S[l]] > 0即左指针再往后移的话滑动窗口就不再满足条件,表示此时已是 当前 r 遍历条件下的最小窗口,然后将 cnt-- 表示后续将 l 右移一步的话,滑动窗口内T中的字符数量将少1。
      • 左指针 l 继续右移一步向后遍历。
  • 最后判断滑动窗口的长度,若大于S的长度表示整个S都不匹配返回空,否则进行切片处理返回字符串S中左指针和右指针所截取的窗口内容。

PS:为什么左指针只需要从左到右 右移一次即可,不需要在每次 右指针r 遍历的情况下将左指针从左到右重新右移一遍?
答:在 r 时,遍历到的最小滑窗窗口比如说 [l,p] ,长度是 p-l+1,r≥p。
在 r+1 时,若想要遍历到更小的窗口,则滑动窗口的左指针只能继续往后移,因为前面已经确定最小的滑动窗口。

#include <iostream>
#include <vector>
using namespace std;
string minWindow(string S, string T) {vector<int>  chars(128, 0);     // ASCII表共128个字符,chars[i]代表ACII值为i的字符在T中出现的次数vector<bool> flag(128, false);  // flag[i]代表代表ACII值为i的字符是否出现// 先统计T中的字符情况for (int i = 0; i < T.size(); ++i) {flag[T[i]] = true;++chars[T[i]];}// 移动滑动窗口, 不断更改统计数据int cnt = 0, l = 0, min_l = 0, min_size = S.size() + 1;for (int r = 0; r < S.size(); ++r) { //接下来的外层循环通过移动窗口的右边界r来遍历字符串S。if (flag[S[r]]) { //若S[r]是T中的字符if (--chars[S[r]] >= 0) { //若当前窗口中还缺该字符,则cnt++++cnt;}// 若目前滑动窗口已包含T中全部字符,// 则尝试将l右移, 在不影响结果的情况下获得最短子字符串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) { // 当前l缩进的窗口已经最小,不再满足条件cnt--;}++l; //左指针右移}}}return min_size > S.size() ? "" : S.substr(min_l, min_size);
}int main() {string S = "ADOBECODEBANC", T = "ABC";cout << minWindow(S,T);return 0;
}

在这里插入图片描述

相关文章:

双指针:滑动窗口

题目描述 给定两个字符串 S 和 T&#xff0c;求 S 中包含 T 所有字符的最短连续子字符串的长度&#xff0c;同时要求时间复杂度不得超过 O(n)。 输入输出样例 输入是两个字符串 S 和 T&#xff0c;输出是一个 S 字符串的子串。样例如下&#xff1a; 在这个样例中&#xff0c…...

云原生(四十八) | Nginx软件安装部署

文章目录 Nginx软件安装部署 一、Nginx软件部署步骤 二、安装与配置Nginx Nginx软件安装部署 一、Nginx软件部署步骤 第一步&#xff1a;安装 Nginx 软件 第二步&#xff1a;把 Nginx 服务添加到开机启动项 第三步&#xff1a;配置 Nginx 第四步&#xff1a;启动Nginx …...

【WPF开发】如何设置窗口背景颜色以及背景图片

在WPF中&#xff0c;可以通过设置窗口的 Background 属性来改变窗口的背景。以下是一些设置窗口背景的不同方法&#xff1a; 一、设置纯色背景 1、可以使用 SolidColorBrush 来设置窗口的背景为单一颜色。 <Window x:Class"YourNamespace.MainWindow"xmlns&quo…...

USB 3.0?USB 3.1?USB 3.2?怎么区分?

还记得小白刚接触电脑的时候&#xff0c;电脑普及的USB接口大部分是USB 2.0&#xff0c;还有少部分USB 1.0的&#xff08;现在基本上找不到了&#xff09;。 当时的电脑显示器&#xff0c;可能00后的小伙伴都没见过&#xff0c;它们大概长这样&#xff1a; 当时小白以为电脑最…...

Gitlab实战教程:打造企业级代码托管与协作平台!

目录 一、Gitlab概述1、Gitlab简介&#xff08;1&#xff09;Gitlab的定义&#xff08;2&#xff09;Gitlab与Git的关系&#xff08;3&#xff09;Gitlab的主要功能 2、Gitlab与Git的关系&#xff08;1&#xff09;Git的基本概念&#xff08;2&#xff09;Gitlab与Git的关联&am…...

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…...

struct和C++的类

1.铺垫 1.1想看明白这章节&#xff0c;必须要懂得C语言的struct结构体、C语言深度解剖的static用法、理解声明与定义&#xff0c;C的类和static用法&#xff1b;否则看起来有些吃力 2.引子 2.1struct结构体里面只能存储内置类型&#xff1b;比如&#xff1a;char、short、 i…...

【数据结构与算法】LeetCode:图论

文章目录 LeetCode&#xff1a;图论岛屿数量&#xff08;Hot 100&#xff09;岛屿的最大面积腐烂的橘子&#xff08;Hot 100&#xff09;课程表&#xff08;Hot 100&#xff09; LeetCode&#xff1a;图论 岛屿数量&#xff08;Hot 100&#xff09; 岛屿数量 DFS: class So…...

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…...

【Python|接口自动化测试】使用requests发送http请求时添加headers

文章目录 1.前言2.HTTP请求头的作用3.在不添加headers时4.反爬虫是什么&#xff1f;5.在请求时添加headers 1.前言 本篇文章主要讲解如何使用requests请求时添加headers&#xff0c;为什么要加headers呢&#xff1f;是因为有些接口不添加headers时&#xff0c;请求会失败。 2…...

需求管理工具Jama Connect:与Jira/Slack/GitHub无缝集成,一站式解决复杂产品开发中的协作难题

在产品和软件开发的动态世界中&#xff0c;有效协作是成功的关键。然而&#xff0c;团队往往面临着阻碍进步和创新的重大挑战。了解这些挑战并找到强有力的解决方案&#xff0c;对于实现无缝、高效的团队协作至关重要。Jama Connect就是这样一种解决方案&#xff0c;它是一个功…...

CSP-J/S 复赛算法 背包DP

文章目录 前言背包DP的简介问题描述目标解决方法1. **定义状态**2. **状态转移方程**3. **初始化**4. **目标**举个例子动态规划解决背包问题的核心 DP背包问题示例代码问题描述代码实现核心代码讲解&#xff1a;举例&#xff1a;总结&#xff1a; 总结 前言 背包问题是算法竞…...

如何评估和部署 IT 运维系统?

如何才能将如此新兴、流行的技术转化为企业中实用的系统环境呢&#xff1f; 为此&#xff0c;我们采访了一家已经成功部署IT运维体系的大型企业的IT总监龙先生&#xff0c;请他给我们讲一下企业应该如何真正评估和部署自己的IT运维体系。 真理就是价值。 1.评估选择&#xf…...

正态分布的极大似然估计一个示例,详细展开的方程求解步骤

此示例是 什么是极大似然估计 中的一个例子&#xff0c;本文的目的是给出更加详细的方程求解步骤&#xff0c;便于数学基础不好的同学理解。 目标 假设我们有一组样本数据 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1​,x2​,…,xn​&#xff0c;它们来自一个正态分布 N…...

s7-200SMART编程软件下载

1、官网&#xff1a; STEP 7 Micro/WIN SMART V2.2 完整版http://w2.siemens.com.cn/download/smart/STEP%207%20MicroWIN%20SMART%20V2.2.zip STEP 7 Micro/WIN SMART V2.3 完整版http://w2.siemens.com.cn/download/smart/STEP%207%20MicroWIN%20SMART%20V2.3.iso STEP 7 Mi…...

Linux驱动开发常用调试方法汇总

引言&#xff1a;在 Linux 驱动开发中&#xff0c;调试是一个至关重要的环节。开发者需要了解多种调试方法&#xff0c;以便能够快速定位和解决问题。 1.利用printk 描述&#xff1a; printk 是 Linux 内核中的一个调试输出函数&#xff0c;类似于用户空间中的 printf。它用于…...

将列表中的各字符串sn连接成为一个字符串s使用;将各sn间隔开os.pathsep.join()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将列表中的各字符串sn 连接成为一个字符串s 使用;将各sn间隔开 os.pathsep.join() [太阳]选择题 下列说法中正确的是? import os paths ["/a", "/b/c", "/d&q…...

算法题总结(八)——字符串

531、反转字符串二 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…...

大数据开发--1.2 Linux介绍及虚拟机网络配置

目录 一. 计算机入门知识介绍 软件和硬件的概述 硬件 软件 操作系统概述 简单介绍 常见的系统操作 学习Linux系统 二. Linux系统介绍 简单介绍 发行版介绍 常用的发行版 三. Linux系统的安装和体验 Linux系统的安装 介绍 虚拟机原理 常见的虚拟机软件 体验Li…...

2024CSP-J复赛易错点

低级错误 不开long long见祖宗写代码要有输入&#xff0c;别没写输入就交写完代码要在本地测试&#xff0c;多想写极端测试数据&#xff0c;或对拍注意考官说文件夹怎么建&#xff0c;别文件夹建错&#xff0c;爆0别忘写freopen或忘给freopen去注释记着把.exe文件删掉考试时不…...

详解:XSS 攻击和 CSRF 攻击

一、先看看核心区别 XSS&#xff1a;偷你的身份-》在你的浏览器里面跑恶意JS &#xff0c;主动拿你的Cookie&#xff0c;冒充你。CSRF&#xff1a;借你的身份-》不偷你的Cookie&#xff0c;而是利用浏览器自带Cookie 的属性&#xff0c;骗网站替你做事。 二、XSS 讲解 1、核心本…...

Utools插件分离功能详解:像浏览器开标签页一样,同时运行多个效率工具

Utools插件分离功能实战&#xff1a;打造多窗口并行工作流的高效引擎 在数字工作时代&#xff0c;效率工具的价值早已超越了单一功能的实现&#xff0c;而在于如何无缝融入复杂的工作场景。对于开发者、内容创作者和知识工作者而言&#xff0c;真正的痛点往往不在于缺少工具&am…...

从硬件电路深入理解计算机中断机制:8088到现代中断控制器

1. 项目概述&#xff1a;从硬件视角重新认识中断在计算机的世界里&#xff0c;中断&#xff08;Interrupt&#xff09;是一个既基础又至关重要的概念。它就像是程序世界里的“紧急呼叫”系统&#xff0c;允许CPU这个“大管家”在埋头处理日常事务&#xff08;执行主程序&#x…...

ComfyUI Segment Anything:零门槛实现智能图像分割的完整指南

ComfyUI Segment Anything&#xff1a;零门槛实现智能图像分割的完整指南 【免费下载链接】comfyui_segment_anything Based on GroundingDino and SAM, use semantic strings to segment any element in an image. The comfyui version of sd-webui-segment-anything. 项目地…...

从信息网络到能源网络:聊聊2012年那篇关于‘能源路由器’的论文,它今天还有哪些启发?

能源路由器的十年回望&#xff1a;从TCP/IP隐喻到虚拟电厂的现实启示 十二年前那篇将能源网络类比TCP/IP协议的论文&#xff0c;在今天看来更像是一封来自过去的预言书。当我们在2023年讨论虚拟电厂和分布式能源交易时&#xff0c;会发现那些曾被视作天马行空的构想——能源操作…...

微流控与图像引导技术实现单细胞谱系追踪与动态操控

1. 项目概述&#xff1a;当单细胞遇见微流控与图像引导在生命科学的前沿探索中&#xff0c;单细胞分析正以前所未有的精度揭示着细胞异质性的奥秘。然而&#xff0c;一个长期困扰研究者的难题是&#xff1a;我们如何不仅仅知道一个细胞在某个时间点的“快照”&#xff0c;还能追…...

Few-shot vid2vid自定义数据集训练指南:从标签图到真实视频的转换

Few-shot vid2vid自定义数据集训练指南&#xff1a;从标签图到真实视频的转换 【免费下载链接】few-shot-vid2vid Pytorch implementation for few-shot photorealistic video-to-video translation. 项目地址: https://gitcode.com/gh_mirrors/fe/few-shot-vid2vid Few…...

STM32CubeMX实战:硬件CRC配置详解与软件算法性能实测

1. STM32硬件CRC模块初探 第一次接触STM32的硬件CRC模块时&#xff0c;我完全被它的效率震惊了。这个看似不起眼的外设&#xff0c;其实是个隐藏的性能怪兽。简单来说&#xff0c;CRC&#xff08;循环冗余校验&#xff09;就像给数据包贴上的防伪标签&#xff0c;而STM32内置的…...

猫抓插件完全指南:浏览器资源嗅探与下载的终极解决方案

猫抓插件完全指南&#xff1a;浏览器资源嗅探与下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在浏览网页时发现心仪的…...

信号处理避坑指南:ESPRIT、Root-Music等DOA估计算法,到底该怎么选?

DOA估计算法选型实战&#xff1a;ESPRIT与MUSIC家族的性能对决 当八通道均匀线阵捕捉到两个间隔仅5的远场信号时&#xff0c;算法A在信噪比15dB时成功分离目标&#xff0c;而算法B直到25dB才能勉强分辨——这种真实场景中的性能差异&#xff0c;正是工程师选择DOA&#xff08;波…...