Leetcode(76)——最小覆盖子串

76. 最小覆盖子串 滑动窗口 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1: 输入:s = “ADOBECODEBANC”, t = “ABC” 输出:“BANC” 示例 2: 输入:s = “a”, t = “a” 输出:“a” 示例 3: 输入: s = “a”, t = “ 阅读详情

Leetcode(76)——最小覆盖子串

题目

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

注意:

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

示例 1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”

示例 2:

输入:s = “a”, t = “a”
输出:“a”

示例 3:

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

提示:

  • 111 <= s.length, t.length <= 10510^5105
  • s 和 t 由英文字母组成

进阶:你能设计一个在 O(n)O(n)O(n) 时间内解决此问题的算法吗?

题解

方法一滑动窗口:

思路

​​  滑动窗口可用于解决一些列的字符匹配问题,典型的问题包括:在字符串 sss 中找到一个最短的子串,使得其能覆盖到目标字符串 ttt。对于目标字符串 ttt,我们可以在字符串 sss 上滑动窗口,当窗口包含 ttt 中的全部字符后,我们再根据题意考虑能否收缩窗口。
​​  在窗口滑动的过程中,我们可以暴力地统计出窗口中所包含的字符是否满足题目要求,但这没有利用到滑动窗口的基本性质。事实上,窗口的滑动过程可分解为以下两步基础操作:

  • 窗口右边界往右滑动一位:窗口右端新加入一个字符,但窗口中的其他字符没有发生变化;
  • 窗口左边界往右滑动一位:窗口左端滑出一个字符,但窗口中的其他字符没有发生变化。

​​  因此,我们可以考虑在「一进一出」这样的两个基础操作上做文章。

在这里插入图片描述

​​  而本问题要求我们返回字符串 sss 中包含字符串 ttt 的全部字符的最小窗口。我们称包含 ttt 的全部字母的窗口为「可行」窗口。
​​  我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 rrr 指针,和一个用于「收缩」窗口的 lll 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 sss 上滑动窗口,通过移动 rrr 指针不断扩张窗口。当窗口包含 ttt 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。

在这里插入图片描述

​​  如何判断当前的窗口包含所有 ttt 所需的字符呢?
​​  我们可以用一个哈希表表示 ttt 中所有的字符以及它们的现有个数(等于0表示刚好满足需求数,大于0表示缺少,小于0表示超出),用一个哈希表动态维护窗口中所有的字符以及它们的个数,如果这个动态表中包含 ttt 的哈希表中的所有字符,并且对应的个数都不小于 ttt 的哈希表中各个字符的个数,那么当前的窗口是「可行」的。

注意:这里 ttt 中可能出现重复的字符,所以我们要记录字符的个数。

​​  考虑如何优化?
​​  如果 s=XX⋯XABCXXXXs = {\rm XX \cdots XABCXXXX}s=XX⋯XABCXXXX,t=ABCt = {\rm ABC}t=ABC,那么显然 [XX⋯XABC]{\rm [XX \cdots XABC]}[XX⋯XABC] 是第一个得到的「可行」区间,得到这个可行区间后,我们按照「收缩」窗口的原则更新左边界,得到最小区间。我们其实做了一些无用的操作,就是更新右边界的时候「延伸」进了很多无用的 X\rm XX,更新左边界的时候「收缩」扔掉了这些无用的 X\rm XX,做了这么多无用的操作,只是为了得到短短的 ABC\rm ABCABC。没错,其实在 sss 中,有的字符我们是不关心的,我们只关心 ttt 中出现的字符,我们可不可以先预处理 sss,扔掉那些 ttt 中没有出现的字符,然后再做滑动窗口呢?也许你会说,这样可能出现 XXABXXC\rm XXABXXCXXABXXC 的情况,在统计长度的时候可以扔掉前两个 X\rm XX,但是不扔掉中间的 X\rm XX,怎样解决这个问题呢?优化后的时空复杂度又是多少?
​​  优化方法:在遍历时找到 ttt 中第一个属于 ttt 字符,并令它为滑动窗口的 head。当 num=0 时,说明找到了一个满足题意的窗口使得中的字符能够覆盖 t 中的全部字符。此时需要更新 head 以除去多余的字符,因为结尾字符一定是需求字符且其个数等于需求总数,只需要更新 head 即可

代码实现

我的初始版本:

class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size() < t.size()) return "";
        unordered_map<char, pair<int, int>> hash;  // <字符,<需求总数,滑动窗口现有总数>>
        for(auto& it: t){
            if(hash.count(it) == 0){
                hash[it].first = 1;
                hash[it].second = 0;
            }else hash[it].first++;
        }
        // 最小子串的头尾和长度,当前子串的头和尾,遍历的指针,当前窗口中未存在的字符个数
        int min_head, min_l, head, ptr, num, size;
        head = ptr = 0;
        num = t.size();
        size = s.size();
        min_l = size + 1;
        while(ptr < size){
            if(hash.count(s[ptr]) != 0){
                hash[s[ptr]].second++;  // 更新该字符的滑动窗口现有总数
                if(hash[s[ptr]].second <= hash[s[ptr]].first) num--;
                if(num == 0){
                    /*
                    如果遇到某个字符的滑动窗口现有总数 > 需求总数,保证头字符 hash[s[head]].second == hash[s[head]].first
                    则更新 head 。更新 head 时,从 head 一直更新到 s 中的某个字符的滑动窗口现有总数等于需求总数
                    并且将该字符的下标作为新的 head
                    */
                    while(true){
                        // 滑动窗口中的每个字符的滑动窗口现有总数一定是大于等于其需求总数
                        if(hash.count(s[head]) != 0){
                            if(hash[s[head]].second == hash[s[head]].first) break;
                            else hash[s[head]].second--;    // 大于其需求总数
                        }
                        head++;
                    }
                    if(ptr-head+1 < min_l){
                        min_l = ptr-head+1;
                        min_head = head;
                    }
                }
            }
            ptr++;
        }
        return min_l > size? "": s.substr(min_head, min_l);
    }
};

我的改进版本(优化哈希表的定义):

class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size() < t.size()) return "";
        unordered_map<char, int> hash;  // <字符, 滑动窗口对该字符需求数(0表示等于需求总数,大于0表示还缺少,小于0表示超出)> 
        for(auto& it: t){
            if(hash.count(it) == 0) hash[it] = 1;
            else hash[it]++;
        }
        // 最小子串的头尾和长度,当前子串的头和尾,遍历的指针,当前窗口中未存在的字符个数
        int min_head, min_l, head, ptr, num, size;
        head = ptr = 0;
        num = t.size();
        size = s.size();
        min_l = size + 1;
        while(ptr < size){
            if(hash.count(s[ptr]) != 0){
                hash[s[ptr]]--;  // 更新该字符的滑动窗口现有总数
                if(hash[s[ptr]] >= 0) num--;
                if(num == 0){
                    /*
                    如果遇到某个字符的滑动窗口现有总数 > 需求总数,保证头字符 hash[s[head]].second == hash[s[head]].first
                    则更新 head 。更新 head 时,从 head 一直更新到 s 中的某个字符的滑动窗口现有总数等于需求总数
                    并且将该字符的下标作为新的 head
                    */
                    while(true){
                        // 滑动窗口中的每个字符的滑动窗口现有总数一定是大于等于其需求总数
                        if(hash.count(s[head]) != 0){
                            if(hash[s[head]] == 0) break;
                            else hash[s[head]]++;    // 大于其需求总数
                        }
                        head++;
                    }
                    if(ptr-head+1 < min_l){
                        min_l = ptr-head+1;
                        min_head = head;
                    }
                }
            }
            ptr++;
        }
        return min_l > size? "": s.substr(min_head, min_l);
    }
};

我的最终改进版本(优化内层循环):

class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size() < t.size()) return "";
        unordered_map<char, int> hash;  // <字符, 滑动窗口对该字符需求数(0表示等于需求总数,大于0表示还缺少,小于0表示超出)> 
        for(auto& it: t){
            if(hash.count(it) == 0) hash[it] = 1;
            else ++hash[it];
        }
        // 最小子串的头尾和长度,当前子串的头和尾,遍历的指针,当前窗口中未存在的字符个数
        int min_head, min_l, head, ptr, num, size;
        head = ptr = 0;
        num = t.size();
        size = s.size();
        min_l = size + 1;
        while(ptr < size){
            if(hash.count(s[ptr]) != 0){
                // 更新该字符的滑动窗口现有总数 --hash[s[ptr]]
                if(--hash[s[ptr]] >= 0) num--;
                // 当 num=0 时,说明找到了一个满足题意的窗口使得中的字符能够覆盖 t 中的全部字符
                // 此时需要更新 head 以除去多余的字符,因为结尾字符一定是需求字符且其个数等于需求总数,只需要更新 head 即可
                while(num == 0){
                    if(ptr-head+1 < min_l){
                        min_l = ptr-head+1;
                        min_head = head;
                    }
                    // 滑动窗口中的每个字符的滑动窗口现有总数一定是大于等于其需求总数
                    // 判断减去当前字符后,是否还满足其在滑动窗口现有总数不少于其需求总数的要求
                    if(hash.count(s[head]) != 0 && ++hash[s[head]] > 0) num++;
                    head++;
                }
            }
            ptr++;
        }
        return min_l > size? "": s.substr(min_head, min_l);
    }
};

Leetcode 官方题解:

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int> chars(128, 0);
        vector<bool> flag(128, false);
        // 先统计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) {
            if (flag[s[r]]) {
                if (--chars[s[r]] >= 0) {
                ++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) {
                        --cnt;
                    }
                    ++l;
                }
            }
        }
        return min_size > s.size()? "": s.substr(min_l, min_size);
    }
};

网友优解:

class Solution {
public:
    string minWindow(string s, string t) {
        int hash[128] = {0};
        for (auto& c : t) {
            ++hash[c];
        }
        int count[128] = {0};
        int cnt = 0;
        int beg = 0;
        int min_len = INT_MAX;
        int min_beg = 0;
        for (int i = 0; i < s.size(); ++i) {
            char c = s[i];
            if (hash[c]) {
                ++count[c];
                if (count[c] <= hash[c]) {
                    ++cnt;
                }
            }
            if (cnt == t.size()) {
                for (; beg < i; ++beg) {
                    char nc = s[beg];
                    if (hash[nc]) {
                        if (count[nc] > hash[nc]) {
                            --count[nc];
                            continue;
                        }
                        break;
                    }
                }
                int len = i - beg + 1;
                if (len < min_len) {
                    min_len = len;
                    min_beg = beg;
                }
            }
        }
        return min_len == INT_MAX? "" : s.substr(min_beg, min_len);
    }
};
复杂度分析

初始版本的代码分析:
时间复杂度:最坏情况下左右指针对 sss 的每个元素各遍历一遍,哈希表中对 sss 中的每个元素各插入、删除一次,对 ttt 中的元素各插入一次。每次检查是否可行会遍历整个 ttt 的哈希表,哈希表的大小与字符集的大小有关,设字符集大小为 CCC,则渐进时间复杂度为 O(C⋅∣s∣+∣t∣)O(C\cdot |s| + |t|)O(C⋅∣s∣+∣t∣)。
空间复杂度:这里用了两张哈希表和多个临时变量作为辅助空间,每个哈希表最多不会存放超过字符集大小的键值对,我们设字符集大小为 CCC,则渐进空间复杂度为 O(C)O(C)O(C)

改进版本的代码分析:
时间复杂度:O(n)O(n)O(n),nnn 指字符串 sss 的长度。虽然在 for 循环里嵌套了一个 while 循环,但是因为 while 循环负责移动 ptrptrptr 指针,且 ptrptrptr 只会从左到右移动一次,因此总时间复杂度仍然是 O(n)O(n)O(n)。
空间复杂度:这里用了一张哈希表和多个临时变量作为辅助空间,每个哈希表最多不会存放超过字符集大小的键值对,我们设字符集大小为 CCC,则渐进空间复杂度为 O(C)O(C)O(C)

LeetCode 76. 最小覆盖子串 | Python 使用滑动窗口的思想,解决《76. 最小覆盖子串》问题 阅读详情

相关推荐

Java实现 LeetCode 76 最小覆盖子串

76. 最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 class Solution { //滑动窗口的应用 ...

南 墙 1万+

力扣 76 、最小覆盖子串

滑动算法

Allenmax90的博客 1176

Leetcode76 最小覆盖子串题解

LeetCode 76 最小覆盖子串讲解,用滑动窗口解决,利用哈希表记录字符变化。

算法笨蛋 703

golang力扣leetcode 76.最小覆盖子串

76.最小覆盖子串76.最小覆盖子串题解代码 76.最小覆盖子串 76.最小覆盖子串 题解 滑动窗口模板题,不知道为啥这也能算hard题 右指针右移之后窗口数据更新 判断窗口是否要收缩 左指针右移之后窗口数据更新 根据题意计算结果 代码 package main import "math" func minWindow(s string, t string) string { wind := make(map[byte]int) need := make(map[byte]int) for i

清风 730

最小覆盖子串

最小覆盖子串,滑动窗口,尺取法

优快云 7454

【困难】力扣算法题解析LeetCode76:最小覆盖子串

题目要求找出字符串 s 中涵盖 t 所有字符的最小子串。使用滑动窗口算法,通过双指针动态调整窗口范围:右指针扩展窗口直至覆盖 t 的所有字符,左指针收缩窗口以寻找最小子串。通过字符频率数组记录匹配状态,确保时间复杂度为 O(m+n)。例如,s = "ADOBECODEBANC",t = "ABC" 时,最小覆盖子串为 "BANC"。若无法满足条件(如 s = "a",t = "aa"),返回空字符串。该

ylumwd的博客 913

力扣(LeetCode)100题:76.最小覆盖子串

本文介绍了LeetCode 76题「最小覆盖子串」的滑动窗口解法。该方法使用两个计数器(cnt_s和cnt_t)分别跟踪窗口字符和目标字符串的字符频率,通过比较cnt_s≥cnt_t判断是否满足条件。算法采用"扩张找可行解,收缩找最优解"的策略:right指针扩展窗口,当条件满足时left指针收缩寻找最小窗口。时间复杂度O(|s|+|t|),空间复杂度O(1)(因字符集有限)。关键点包括Python Counter的比较语义和滑动窗口的正确性保证,最后返回满足条件的最短子串或空字符串。

sweet_ran的博客 413

SQLite学习——Dapper初识

dapper下载:https://www.nuget.org/packages/Dapper/1.40.0

jiDxiaohuo的博客 1294

LeetCode76.最小覆盖子串

LeetCode 76.最小覆盖子串 题目描述: 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-window-substrin

qq_40751552的博客 187

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2726

3D视觉-结构光测量-线结构光测量

线结构光测量中,由激光器射出的激光光束透过柱面透镜扩束,再经过准直,产生一束片状光。这片光束像刀刃一样横切在待测物体表面,因此线结构光法又被成为光切法。线结构光测量常采用二维面阵CCD作为接受器件,因此只要通过增加垂直于面阵探测器的第三维度方向,就可以实现对三维物体的测量。

qq_20660115的博客 3121

力扣76.最小覆盖子串

力扣76.最小覆盖子串给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。这道题需要思考一个问题,在代码中如何确定字符串s中涵盖字符串t呢?就比如字符串sBCDEAA,字符串tABC,怎么判断字符串s中涵盖了字符串t?我的做法是用两个数组tArray 和 sArray,分别记录字符串t和字符串s每个字符的数量。若字符串t涵盖字符串s,那么对于任意的字符c,都存在,根据这个就可以判断是否涵盖了。

沉迷写代码的程序猿的博客 1094

【AIGC】人工智能训练师(高级)考试题库-橙点同学

例如,在嘈杂的环境中进行声音转文字,即使是优秀的模型也可能会出现一些错误,但这并不意味着该模型本身质量差,在其他较为理想的环境下,它可能会有很好的表现。例如,在一些语音应用和系统中,会使用SSML来实现对语音合成的精细控制,如调整语速、语调、音量等,而这些应用和系统的开发往往会遵循W3C的相关标准和框架,其中就包括SSML这一语音合成标记语言。例如,在语音识别等场景中,像“去火车站怎么走”这样的语音指令,没有其他嘈杂的背景声音或模糊不清的表述,就属于无噪音的数据,有利于系统准确地进行处理和分析。

RisunJan的博客 9915

LeetCode 76:最小覆盖子串

给定字符串s和t,需找到 st。若不存在则返回空字符串。

m0_75126572的博客 1378

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6068

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

76. 最小覆盖子串【 力扣(LeetCode) 】

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

yyh520025的博客 1273

FISCO BCOS平台的用户权限控制与分类管理

在区块链技术日益广泛应用的今天,如何管理与控制不同用户的权限,确保系统的安全性与高效性,成为了区块链平台不可忽视的一部分。FISCO BCOS作为一款高效的联盟链平台,通过细粒度的权限控制机制,提供了对不同用户权限的有效管理。本文将深入探讨FISCO BCOS如何实现用户的权限控制,并对不同用户进行分类与权限管理。FISCO BCOS平台通过精密的权限控制机制,不仅提供了对用户表和系统表的细粒度权限管理,还通过工具与接口为开发者和管理员提供了便捷的权限配置与查询功能。

2201_75798391的博客 1060

76. 最小覆盖子串 - 力扣(LeetCode)

通俗来讲,滑动窗口本质还是快慢指针法,一快一慢两个指针前后移动,中间的部分就是窗口。内部没有元素存在, 后续遍历会扩大形成滑动窗口,窗口内包含 t 中所有的字符串。解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。因此首先,在字符串 s 中建立快慢指针放在队首,这里初始窗口设计为。解释: t 中两个字符 'a' 均应包含在 s 的子串中,所有字符的最小字符串片段,对字符的顺序无要求。的长度,说明没有找到有效窗口,返回空字符串。输入:s = "a", t = "a"

q1111111da的博客 2160

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采集到的数据进行处理和解算,上层用户交互层负责与用户进行交互并显示系统状态信息。

嵌入式阿齐Archie 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【力扣76】最小覆盖子串

本文介绍了LeetCode上最小覆盖子串问题的滑动窗口解法。题目要求在母串s中找到包含目标串t所有字符的最短连续子串。核心思路是:1)使用双指针维护滑动窗口,右指针扩展窗口直至包含所有t字符,左指针收缩窗口寻找最短有效子串;2)用固定长度数组替代哈希表统计字符频次,提高效率;3)通过valid和needCount变量快速判断窗口有效性。该算法时间复杂度O(m+n),空间复杂度O(1),是此类子串匹配问题的经典模板解法。掌握扩窗找有效、缩窗求最优的思路可高效解决同类问题。

27届Java后端炒粉练习生,AICoding中........ 656

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JavaScript实现最小覆盖子串--力扣(leetcode 76题)

目录 1 问题 2 输入输出 3 解答 滑动窗口 4 代码 1 问题 https://leetcode-cn.com/problems/minimum-window-substring/ 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 2 输入输出 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,

bailizx 717

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode 76 最小覆盖子串

LeetCode 76 最小覆盖子串 最小覆盖子串 题目描述 题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 题解 这题属于滑动窗口类型。思路简单来说就是,用start、end控制一个滑动窗口。当滑动窗口中未包含所有T中字符,end右移

newbiee的博客 256

leetcode_ 76 最小覆盖子串

本文介绍了在字符串s中寻找涵盖字符串t所有字符的最小子串的两种解法。第一种使用不定滑动窗口,每次检查窗口是否满足条件,时间复杂度O(n+52m)。第二种优化方法通过记录字符差值来减少判断时间,时间复杂度O(n+m)。两种方法的空间复杂度均为O(52)。文章还提醒注意处理无解情况,并提供了C++实现代码。

bdn_nbd的博客 1193

LeetCode 76题「最小覆盖子串」

LeetCode 76题「最小覆盖子串」是一道经典的滑动窗口算法题目,难度为困难。题目要求在给定的字符串s中找到包含字符串t所有字符的最小子串,若不存在则返回空字符串。

weixin_45524582的博客 831
上一篇: Leetcode(142)——环形链表 II
下一篇: Leetcode(633)——平方数之和
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值