【算法设计与分析】最小覆盖字串

       📝个人主页:五敷有你      

 🔥系列专栏:算法分析与设计

⛺️稳中求进,晒太阳

题目

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。

思路 

用哈希表+滑动窗口

算法分析与实现

  1. 初始化变量和数据结构

    • 定义变量 n1n2 分别表示字符串 st 的长度。
    • 初始化空字符串 minStr 用于存储最小子串。
    • 初始化变量 left 为0,表示窗口的左边界。
    • 使用 HashMap 数据结构 map 存储字符串 t 中每个字符及其出现次数。
  2. 统计字符串 t 中字符的出现次数

    • 遍历字符串 t 中的每个字符,将字符及其出现次数存储在 map 中。
  3. 遍历字符串 s 中的字符

    • 使用变量 count 统计当前窗口中包含字符串 t 中字符的数量。
    • 遍历字符串 s 中的字符,如果字符在 t 中,更新 map 中对应字符的出现次数,并根据出现次数是否大于等于零更新 count
    • count 等于 n2 时,表示当前窗口包含了字符串 t 中的所有字符,进入内部的 while 循环。
  4. 滑动窗口

    • while 循环中,首先更新最小子串 minStr,如果当前子串比之前的子串更短或者 minStr 为空,则更新。
    • 然后移动窗口的左边界 left,通过逐步增加左边界的位置,缩小窗口,直到不能满足包含所有字符的条件。
    • 继续遍历字符串 s 中的字符,重复上述步骤,直到遍历完成。
  5. 返回最小子串

    • 返回最终的最小子串 minStr

这个算法通过滑动窗口的方式,优化了暴力搜索的复杂度,使得算法在时间上更为高效

 代码实现

 

class Solution {public String minWindow(String s, String t) {int n1 = s.length();int n2 = t.length();String minStr = "";int left = 0;Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < n2; i++) {map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);}int count = 0;for (int j = 0; j < n1; j++) {if (map.containsKey(s.charAt(j))) {map.put(s.charAt(j), map.get(s.charAt(j)) - 1);if (map.get(s.charAt(j)) >= 0) {count++;}while (count == n2) {if (minStr.equals("") || j - left + 1 < minStr.length()) {minStr = s.substring(left, j + 1);}if (map.containsKey(s.charAt(left))) {map.put(s.charAt(left), map.get(s.charAt(left)) + 1);if (map.get(s.charAt(left)) > 0) {count--;}}left++;}}}return minStr;}
}

运行结果

时间复杂度为

        其中 n2 为字符串 t 的长度。内部有一个 while 循环,但由于每个字符最多只会进入窗口两次(一次进入,一次出去),整体的时间复杂度仍然是 O(n1),其中 n1 为字符串 s 的长度。

空间复杂度分析

        最坏情况下,map 中可能存储字符串 t 所有不同字符,因此空间复杂度为 O(n2),其中 n2 为字符串 t 的长度。

综合分析:

  • 时间复杂度: O(n1 + n2)
  • 空间复杂度: O(n2)

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

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

相关文章

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…

【深度学习理论】持续更新

文章目录 1.统计学习理论 1.统计学习理论 统计学习理论&#xff0c;一款适合零成本搞深度学习的大冤种的方向 从人类学习到机器学习的对比&#xff08;学习的过程分为归纳和演绎 &#xff09;&#xff0c;引出泛化和过拟合的概念。 如何表示归纳的函数规律呢&#xff1f;以监督…

XAI:探索AI决策透明化的前沿与展望

文章目录 &#x1f4d1;前言一、XAI的重要性二、为什么需要可解释人工智能三、XAI的研究与应用四、XAI的挑战与展望 &#x1f4d1;前言 随着人工智能技术的快速发展&#xff0c;它已经深入到了我们生活的方方面面&#xff0c;从智能手机、自动驾驶汽车到医疗诊断和金融投资&…

【Linux驱动】块设备驱动(二)—— 块设备读写(使用请求队列)

块设备的操作函数并没有类似于字符驱动中的read 和write函数&#xff0c;要实现读写操作&#xff0c;只能在请求处理函数中实现。这就分为两种&#xff0c;是否要使用请求队列&#xff0c;请求队列的主要作用是管理和调度IO请求。在以下情况中&#xff0c;一般需要用到请求队队…

C++:深入剖析默认参数

看下列代码执行结果&#xff0c;你猜一猜会输出什么&#xff1f; #include<iostream> using namespace std; struct A {virtual void fun(int a 10) {cout << "A,a"<<a;} }; struct B :public A {void fun(int a 5) {cout <<"B,a&qu…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

编码世界探秘:原反补码与实数表示,含定点、浮点及BCD编码

数值的编码表示 整数编码表示 在计算机中&#xff0c;因为只有0和1这两种形式&#xff0c;但为了表示数的正&#xff08;&#xff09;&#xff0c;负&#xff08;-&#xff09;号&#xff0c;就要将数的符号以0和1编码。 通常把一个数的最高位定义为符号位&#xff0c;用0表…

Zephyr NRF7002 实现AppleJuice

BLE的基础知识 ble的信道和BR/EDR的信道是完全不一样的。但是范围是相同的&#xff0c;差不多也都是2.4Ghz的频道。可以简单理解为空中有40个信道0~39信道。两个设备在相同的信道里面可以进行相互通信。 而这些信道SIG又重新编号&#xff1a; 这个编号就是把37 38 39。 3个信道…

Python中的while循环,知其然知其所以然

文章目录 while循环结构1.用循环打印1 ~ 100步骤解析2. 1 ~ 100的累加和3.死循环1. 用死循环的方法实现 1 ~ 100累加和 4. 单向循环(1)打印 一行十个小星星*(2)通过打印一个变量的形式,展现一行十个小星星(3)一行十个换色的星星 ★☆★☆★☆★☆★☆(4)用一个循环,打印十行十列…

5、从 CSV 到 ChatGPT 的完整分析报告,只需 5 个简单步骤

从 CSV 到 ChatGPT 的完整分析报告,只需 5 个简单步骤 数据分析是一项耗时的活动。使用 ChatGPT,我们可以在短时间内进行数据汇总、数据预处理、数据可视化等。 无论您从事什么行业,在数据驱动时代,知道如何分析数据比以往任何时候都更加重要。数据分析将使企业能够保持竞…

【C语言 - 哈希表 - 力扣 - 相交链表】

相交链表题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0…