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;

        // 遍历 s
        while (r < s.length()) {
            // 当前字符在 t 中
            if (tCount[s.charAt(r) - 'A'] > 0) {
                // 更新窗口内字符计数
                sCount[s.charAt(r) - 'A']++;
                // 如果窗口中的字符数量满足 t 中的需求,则减少 required
                if (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']--;
                    // 如果移动左边界后窗口不再满足条件,增加 required
                    if (sCount[s.charAt(l) - 'A'] < tCount[s.charAt(l) - 'A']) {
                        required++;
                    }
                }
                l++;
            }
            r++;
        }
        // 返回最小覆盖子串,如果没有找到则返回空字符串
        return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构师】-软件架构设计

1、软件架构的概念 架构的本质 1、软件架构为软件系统提供了一个结构、行为和属性的高级抽象。 2、软件架构风格是特定应用领域的惯用模式&#xff0c;架构定义一个词汇表和一组约束。 架构的作用 1、软件架构是项目干系人进行交流的手段。 2、软件架构是可传递和可复用的模型…

ESP32S3网络编程学习笔记(1)—— Wi-Fi扫描实验

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动/单片机/RTOS的实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff…

深澜计费管理系统 任意文件读取漏洞复现

0x01 产品简介 深澜计费管理系统是是一套完善的领先的具有复杂生物型特征的弹性认证计费系统。系统主要由 AAA 认证计费平台、系统运营维护管理平台、用户及策略管理平台、用户自助服务平台、智能客户端模块、消息推送模块、数据统计模块组成。目前在全球为超过 2500 家客户提…

Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI 入门

作者&#xff1a;来自 Elastic Jonathan Simon 最近&#xff0c;Elastic 宣布 AI 观测助手现已正式向所有 Elastic 用户开放。该 AI 观测助手为 Elastic 观测提供了一种新工具&#xff0c;提供了大型语言模型&#xff08;LLM&#xff09;连接的聊天和上下文洞察&#xff0c;以解…

node res.end返回json格式数据

使用 Node.js 内置 http 模块的createServer()方法创建一个新的HTTP服务器并返回json数据&#xff0c;代码如下&#xff1a; const http require(http);const hostname 127.0.0.1; const port 3000;const data [{ name: 测试1号, index: 0 },{ name: 测试2号, index: 1 },…

优秀企业都在用的企微知识库,再不搭建就晚了!

每个团队都在寻找让工作效率提升的方法。如果你想知道哪些团队能够高效地完成任务&#xff0c;而另一些却步履维艰&#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…

Python标准数据类型—字符串常用方法

在Python中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于表示文本信息。Python提供了许多内置方法来处理字符串&#xff0c;使得对文本的操作变得非常方便。在本篇博客中&#xff0c;我们将介绍一些常用的字符串方法&#xff0c;帮助您更好地理解和利用字符串。 &a…

基于java web的超市管理系统

摘要 随着社会经济的不断发展&#xff0c;人们的生活水平不断提高。越来越多的零售行业得到了快速的发展&#xff0c;以最常见的超市最为明显。零售行业繁荣的背后也随之带来了许多行业隐患&#xff0c;越来越激烈的行业竞争不断的要求经营者更加高要求的管理超市内部的整个供…

4.7学习总结

java学习 一.Stream流 (一.)概念: Stream将要处理的元素集合看作一种流&#xff0c;在流的过程中&#xff0c;借助Stream API对流中的元素进行操作&#xff0c;比如&#xff1a;筛选、排序、聚合等。Stream流是对集合&#xff08;Collection&#xff09;对象功能的增强&…

算法 第34天 贪心3

1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

JavaEE——手把手教你实现简单的 servlet 项目

文章目录 一、什么是 Servlet二、创建一个简单的 Servlet 程序1. 创建项目2.引入依赖3. 创建目录4.编写代码5. 打包程序6. 部署7.验证整体过程总结 三、使用 Smart Tomcat 插件简化项目创建四、创建项目时可能遇到的几个问题。 一、什么是 Servlet Servlet 是一种实现 动态页面…

Bigtable [OSDI‘06] 论文阅读笔记

原论文&#xff1a;Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统&#xff0c;可扩展到非常大的规模&#xff1a;数千台服务器上的数据量可达 PB 级别&#xff0c;同时保证可靠…

苍穹外卖Day10——总结10

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…

在 K8s 上跑腾讯云 Serverless 函数,打破传统方式造就新变革

目录 目录 前言 Serverless 和 K8s 的优势 1、关于Serverless 函数的特点 2、K8s 的特点 腾讯云 Serverless 函数在 K8s 上的应用对企业服务的影响 1、弹性扩展和高可用性 2、成本优化和资源利用 3、简化部署和管理 拓展&#xff1a;腾讯云云函数 SCF on K8s 番外篇…

隐私计算实训营第七讲-隐语SCQL的开发实践

隐私计算实训营第七讲-隐语SCQL的开发实践 文章目录 隐私计算实训营第七讲-隐语SCQL的开发实践1.如何使用SCQL&#xff1f;2.使用流程3.SCQL部署4.SCQL使用示例4.1创建用户4.2创建项目&用户授权4.3创建表4.4设置CCL4.5发起联合分析查询 1.如何使用SCQL&#xff1f; 2.使用流…

工具推荐-针对Nacos利器-NacosExploitGUI_v4.0

Nacos是由阿里所开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 工具简介 集成Nacos的各种poc Nacos控制台默认口令漏洞(nacos,nacos)Nacostoken.secret.key默认配置(QVD-2023-6271)Nacos-clientYaml反序列化漏洞Nacos Jraft Hessian反序列化漏洞…

通用开发技能系列:Git

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能Git进行学习 1.为什么使用版本控制系统 版本控制系统可以解决的问题 代码备份很重要版本控制很重要协同工作很重要责任追溯很重要 常见的版本控制系统 Gi…

设计模式之命令模式(上)

命令模式 1&#xff09;概述 1.定义 命令模式(Command Pattern) 将一个请求封装为一个对象&#xff0c;可以用不同的请求对客户进行参数化&#xff1b;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。 2.作用 命令模式可以将请求发送者和接收者完全解耦&am…

Redis教程——数据类型(字符串、列表)

上篇文章我们学习了Redis教程——Redis入门&#xff0c;这篇文章我们学习Redis教程——数据类型&#xff08;字符串、列表&#xff09;。 Redis数据类型有&#xff1a;字符串、列表、哈希表、集合、有序集合、地理空间、基数统计、位图、位域和流。 字符串String 字符串类型…