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.hqwc.cn/news/598406.html

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

相关文章

串口和 蓝牙模块HC08

串口基本认知 串行接口简称串口&#xff0c;也称 串行通信 接口或 串行通讯接口 &#xff08;通常指 COM 接口 &#xff09;&#xff0c;是采用串行通信方 式的 扩展接口 。串行 接口&#xff08;Serial Interface &#xff09;是指数据一位一位地顺序传送。其特点是 通信线路…

Spring Security——11,自定义权限校验方法

自定义权限校验方法 一键三连有没有捏~~ 我们也可以定义自己的权限校验方法&#xff0c;在PreAuthorize注解中使用我们的方法。 自定义一个权限检验方法&#xff1a; 在SPEL表达式中使用 ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的 hasAuthority方法&am…

ssm026校园美食交流系统+vue

校园美食交流系统 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

jdk目录结构

jdk目录详解 JDK(Java Development Kit&#xff0c;Java开发包&#xff0c;Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者 编译&#xff0c;调试和运行用Java语言写的applet和应用程序所需的工具组成。 JDK(J…

Centos7安装单机版Kafka

下载 链接&#xff1a;https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码&#xff1a;hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…

技术再度取得优势,人工智能兴起推动需求,美芯涨价收割市场,收割中国制造?...

独家首发 ------------- 分析机构指出一季度全球存储芯片涨价了15%左右&#xff0c;而近期三星半导体预测全球存储芯片的价格还将继续上涨&#xff0c;预计二季度至少上涨两成&#xff0c;显示出美系芯片在忍受了一年多的亏损之后再度联手涨价。 2022年中国存储芯片取得了重大进…

基于51单片机教室灯光全自动控制设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机教室灯光全自动控制设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 基于51单片机教室灯光全自动控制设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 仿真图pro…

基于Springboot的航班进出港管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的航班进出港管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

MySQL一条SQL语句的执行过程

MySQL一条SQL语句的执行过程可以大致分为以下几个步骤&#xff1a; mysq分层架构 为了理解这个问题&#xff0c;先从Mysql的架构说起&#xff0c;对于Mysql来说&#xff0c;大致可以分为3层架构。 网络连接层&#xff1a; 作为客户端和服务端的连接&#xff0c;连接器负责处…

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…

第7章 数据安全

思维导图 7.1 引言 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计。虽然数据安全的详细情况(如哪些数据需要保护)因行业和国家有所不同&#xff0c;但是数据安全实践的目标是相同的&#xff0c;即根据隐私和…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具&#xff0c;它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性&#xff0c;同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…