12、最小覆盖子串

 

如何想到这个解法


问题的特点:

  1. 首先,认识到这是一个关于子串的问题,而且需要考虑子串的最小长度。这提示我们可能需要使用一种方式来逐步探索不同的子串。
  2. 滑动窗口的适用性:滑动窗口是处理子串问题的常用技巧,特别是当我们需要找到满足特定条件的最短或最长子串时。在这个问题中,我们需要找到包含所有特定字符的最短子串,这正是滑动窗口擅长的。
  3. 动态调整窗口大小:认识到我们可以动态地调整窗口的大小来探索不同的子串。通过扩展和收缩窗口的边界,我们可以有效地覆盖所有可能的子串,同时保持对窗口内字符的跟踪。
  4. 字符计数:为了判断窗口内的子串是否包含了 t 中的所有字符,我们可以使用字符计数。通过比较 s 的子串和 t 中字符的计数,我们可以知道当前窗口是否满足条件。
  5. 优化性能:理解到在移动窗口时,我们不需要每次都从头开始计算。我们可以利用之前的计算结果,每次只对进入和离开窗口的字符进行计数更新。这样,算法的效率更高。

解题思路的构思

  1. 初始化计数器和窗口指针:首先,计算字符串 t 中每个字符的出现次数,并初始化两个指针(l 和 r)来表示窗口的左右边界。
  2. 移动右边界以扩展窗口:逐步移动右边界,每次移动都更新窗口内的字符计数。每当窗口包含所有 t 中的字符时,我们就找到了一个潜在的答案。
  3. 收缩左边界以缩小窗口:一旦窗口满足条件,尝试移动左边界以缩小窗口大小。这一步是为了找到更短的满足条件的子串。
  4. 更新最短覆盖子串:在每个满足条件的窗口中,如果当前窗口的长度小于之前找到的最短子串,更新最短子串。
  5. 继续直到结束:重复以上步骤,直到右边界到达字符串 s 的末尾。
class Solution {public static String minWindow(String s, String t) {// 检查输入字符串是否有效if (s == null || t == null || s.length() < t.length()) {return "";}// tCount 用于存储 t 中每个字符出现的次数int[] tCount = new int[100];for (int i = 0; i < t.length(); i++) {tCount[t.charAt(i) - 'A']++;}// sCount 用于存储当前窗口中每个字符出现的次数int[] sCount = new int[100];// 初始化最小窗口的起始位置和长度int start = 0, minLen = Integer.MAX_VALUE;// required 用于跟踪窗口中还需要多少个 t 中的字符int required = t.length();// 初始化左右指针int l = 0, r = 0;// 遍历 swhile (r < s.length()) {// 当前字符在 t 中if (tCount[s.charAt(r) - 'A'] > 0) {// 更新窗口内字符计数sCount[s.charAt(r) - 'A']++;// 如果窗口中的字符数量满足 t 中的需求,则减少 requiredif (sCount[s.charAt(r) - 'A'] <= tCount[s.charAt(r) - 'A']) {required--;}}// 当 required 为 0 时,窗口已包含 t 的所有字符while (required == 0) {// 检查当前窗口是否是最小窗口if (r - l + 1 < minLen) {minLen = r - l + 1;start = l;}// 尝试移动左边界以缩小窗口if (tCount[s.charAt(l) - 'A'] > 0) {sCount[s.charAt(l) - 'A']--;// 如果移动左边界后窗口不再满足条件,增加 requiredif (sCount[s.charAt(l) - 'A'] < tCount[s.charAt(l) - 'A']) {required++;}}l++;}r++;}// 返回最小覆盖子串,如果没有找到则返回空字符串return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);}
}

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

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

相关文章

【图像分割】nnUnetV1与V2的Linux部署与应用命令

以前觉得麻烦&#xff0c;一直没用过nnunet&#xff0c;虽然知道它很火&#xff0c;最近一个契机&#xff0c;部署使用了一下nnunet&#xff0c;记录一下其部署和使用的方法与命令。 1、部署 首先&#xff0c;我有一个环境&#xff0c;这个环境可以是以前就有的&#xff0c;也可…

1.c++入门(命名空间、缺省参数、函数重载、引用、内联函数、for循环、auto关键字、指针空值nullptr)

1.c的第一个程序 // 方法一 #include<iostream>// namespace为命名空间的关键字&#xff0c;std为空间名&#xff1b; C标准库的东西放进std命名空间 using namespace std; int main() {cout << "hello world" << endl;return 0; }// 方法二 #in…

YOLOv8的多分类模型如何计算准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score模型评估参数

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

【leetCode】2810. 故障键盘

文章目录 [2810. 故障键盘](https://leetcode.cn/problems/faulty-keyboard/)思路一&#xff1a;模拟代码&#xff1a;思路二&#xff1a;双端队列代码&#xff1a; 2810. 故障键盘 思路一&#xff1a;模拟 用StringBuilder来拼贴字符遍历字符串&#xff0c;如果遇到i,对拼贴好…

注解,自定义注解和元注解

1.注解 1.1.注解概述、作用 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0…

《深入浅出多模态》:多模态经典模型CLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

逆向案例14——cnki学术翻译AES加密分析,涉及保持会话和获取token值

python代码&#xff1a; import execjs import requests UA "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" token_url "https://dict.cnki.net/fyzs-front-api/getToken" url …

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

一文读懂Memory consistency model (内存模型)

Memory consistency model又称Memory model (内存模型)&#xff0c;定义了使用Shared memory(共享内存)执行多线程(Multithread)程序所允许的行为规范。Memory model定义了软硬件接口规范&#xff0c;以便程序员预料硬件会有什么行为&#xff0c;而硬件实现者知道可以使用什么样…

牛客NC181 单词拆分(一)【中等 动态规划,前缀树 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c0d32c1ce5744472a01b2351a2c2767f 思路 前缀树动态规划参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

OpenCV4.9处理平滑图像

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用OpenCV4.9的随机生成器和文本 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何使用 OpenCV …

助力瓷砖生产智造,基于YOLOv5全系列参数【n/s/m/l/x】模型开发构建瓷砖生产制造场景下1280尺寸瓷砖表面瑕疵检测识别系统

砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光&#xff0c;最后进行质量检测和包装。得益于产业自动化的发展&#xff0c;目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说&#xff0c;一条产线需要配数名质检工&#…

【三十三】【算法分析与设计】回溯(1),46. 全排列,78. 子集,没有树结构,但是依旧模拟树结构,回溯,利用全局变量+递归函数模拟树结构

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1&#xff0c;2&#xff0c;3] 输出&#xff1a;[[1&#xff0c;2&#xff0c;3]&#xff0c;[1&#xff0c;3&a…

缺陷检测项目 | 使用OpenCV实现纺织品表面缺陷检测

项目应用场景 面向纺织品表面缺陷检测场景&#xff0c;使用 OpenCV 来实现&#xff0c;因此无需深度学习复杂的训练流程&#xff0c;实现起来会更加便捷。 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md 项目采用 VisualStudio C# 开发&#xff0c;所以用 Visua…

AcWing---转圈游戏---快速幂

太久没写快速幂了... 这是一道数学题orz&#xff0c;能看出来的话答案就是 &#xff0c;但是很大&#xff0c;同时还要mod n&#xff0c;直接用快速幂即可。 快速幂模版&#xff1a; long long int power(long long int a,long long int b,long long int mod){long long int r…

pandas(day6 图表)

一. 计算效率 1. 测量代码运行时间 %%time %%timeit 单纯计算 代码块执行的时长 %%time _sum(np.arange(6)) CPU times: total: 0 ns Wall time: 1.66 ms用于多次运行代码块并计算平均执行时间 %%timeit _sum(np.arange(6))738 ns 10.7 ns per loop (mean std. dev. of 7…

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 “集合讲的是数据&#xff0c;流讲的是计算! ” 特点&#xff1a; Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

金三银四面试题(十六):MySQL面试都问什么(1)

在开发岗位面试中&#xff0c;MySQL基本是必考环节。所以接下来我们就进入MySQL八股文环节&#xff0c;看看都有哪些高频考题。 MySQL 中有哪些不同的表格&#xff1f; 在MySQL中&#xff0c;可以创建多种不同类型的表格&#xff0c;其中一些常见的类型包括&#xff1a; InnoD…

性能优化-如何爽玩多线程来开发

前言 多线程大家肯定都不陌生&#xff0c;理论滚瓜烂熟&#xff0c;八股天花乱坠&#xff0c;但是大家有多少在代码中实践过呢&#xff1f;很多人在实际开发中可能就用用Async&#xff0c;new Thread()。线程池也很少有人会自己去建&#xff0c;默认的随便用用。在工作中大家对…