当前位置: 首页 > 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文件删掉考试时不…...

2026 API 中转平台选型报告:从冗余性到工程效率

1. 4SAPI —— 商业生产的“压舱石”4SAPI 在 2026 年的技术站位极其稳固&#xff0c;主要得益于其对**企业级 SLA&#xff08;服务等级协议&#xff09;**的严苛执行。核心逻辑&#xff1a;其底层架构采用了类似多云 CDN 的分发机制。当上游官方接口&#xff08;如 OpenAI 或 …...

别再死磕英文手册了!手把手带你用Lisflood-FP跑通第一个洪水模拟案例(附T001_buscot实战)

从零到一&#xff1a;Lisflood-FP洪水模拟实战指南&#xff08;T001_buscot案例详解&#xff09; 刚接触水文模型的研究者常被英文手册劝退——密密麻麻的公式、晦涩的术语、复杂的参数配置让人望而生畏。其实&#xff0c;掌握Lisflood-FP的关键不在于死磕理论&#xff0c;而在…...

Qwen3.5-9B-AWQ-4bit惊艳效果:多对象复杂场景图中主次关系与逻辑推断展示

Qwen3.5-9B-AWQ-4bit惊艳效果&#xff1a;多对象复杂场景图中主次关系与逻辑推断展示 1. 模型能力概览 千问3.5-9B-AWQ-4bit是一款突破性的多模态AI模型&#xff0c;它能够像人类一样"看懂"图片并做出智能分析。不同于传统图像识别工具&#xff0c;这个模型最令人惊…...

从 Python 和 Node.js 的流行看 Java 的真实位置

很多 Java 程序员都会有一个感觉&#xff1a;Python 很火&#xff0c;Node.js 也很火&#xff0c;Java 是不是没落了&#xff1f; 先说结论&#xff1a;Java 没有没落&#xff0c;只是位置变了。一、为什么 Python 和 Node.js 看起来更火 1. Python 火&#xff0c;是因为 AI 太…...

突破试用限制:开源脚本实现IDM无限使用的完整解决方案

突破试用限制&#xff1a;开源脚本实现IDM无限使用的完整解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 一、问题引入&#xff1a;IDM用户的痛点与解决…...

4款GitHub热门浏览器自动化工具横向评测:哪款最适合你的开发需求?

4款GitHub热门浏览器自动化工具横向评测&#xff1a;哪款最适合你的开发需求&#xff1f; 在数字化转型浪潮中&#xff0c;浏览器自动化已成为提升开发效率的关键技术。无论是日常的数据采集、自动化测试&#xff0c;还是复杂的AI代理交互&#xff0c;选择一款合适的工具往往能…...

Nanbeige4.1-3B惊艳效果:同一硬件下对比Phi-3-mini,Nanbeige长文本保持率+35%

Nanbeige4.1-3B惊艳效果&#xff1a;同一硬件下对比Phi-3-mini&#xff0c;Nanbeige长文本保持率35% 最近&#xff0c;一个只有30亿参数的小模型在开发者圈子里悄悄火了起来。它不是那种动辄千亿参数、需要顶级显卡才能跑的“巨无霸”&#xff0c;而是一个在普通硬件上就能流畅…...

ConvNeXt 改进 :ConvNeXt添加可变形卷积(DCNv2,CVPR 2018),实现高效涨点,二次创新CNBlock结构 ,独家首发

本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 前言 DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的Co…...

如何在树莓派上用TinyProxy搭建轻量级HTTP代理(附性能优化技巧)

树莓派上部署TinyProxy的工程实践与深度调优指南 当你在咖啡厅用树莓派搭建的微型服务器调试物联网设备时&#xff0c;突然发现所有外网请求都需要经过代理——这就是TinyProxy在嵌入式场景下的典型应用。不同于x86服务器的部署&#xff0c;在ARM架构的树莓派上运行代理服务需要…...

Synopsys AXI VIP实战:如何用reorder和delay配置模拟真实SoC总线行为

Synopsys AXI VIP实战&#xff1a;用reorder与delay构建高保真SoC总线模拟环境 在SoC验证领域&#xff0c;AXI总线协议的复杂性常常成为验证工程师面临的主要挑战。当CPU通过Cache访问低速外设时&#xff0c;总线上的竞争、延迟和乱序响应会形成难以预测的行为模式。Synopsys A…...