LeetCode----76. 最小覆盖子串

这篇具有很好参考价值的文章主要介绍了LeetCode----76. 最小覆盖子串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 题目
给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

m == s.length
n == t.length
1 <= m, n <= 105
s 和 t 由英文字母组成

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

 java代码
这个问题可以使用滑动窗口算法来解决。滑动窗口算法通常用于找到包含一组特定字符或元素的最短子串。

以下是使用Java实现的滑动窗口算法来找到涵盖字符串 t 所有字符的最小子串:

class Solution {
    public String minWindow(String s, String t) {
        int[] tChars = new int[128]; // 用于存储字符串 t 中各字符的出现次数
        for (char c : t.toCharArray()) {
            tChars[c]++;
        }

        int left = 0, right = 0; // 滑动窗口的左右指针
        int minLen = Integer.MAX_VALUE; // 最小子串的长度
        int minStart = 0; // 最小子串的起始位置
        int remaining = t.length(); // t 中未被覆盖的字符数

        while (right < s.length()) {
            if (tChars[s.charAt(right)] > 0) {
                remaining--;
            }
            tChars[s.charAt(right)]--;

            while (remaining == 0) {
                if (right - left + 1 < minLen) {
                    minLen = right - left + 1;
                    minStart = left;
                }

                tChars[s.charAt(left)]++;
                if (tChars[s.charAt(left)] > 0) {
                    remaining++;
                }

                left++;
            }

            right++;
        }

        return minLen == Integer.MAX_VALUE ? "" : s.substring(minStart, minStart + minLen);
    }
}

使用滑动窗口来找到最小子串
首先,构建一个 tChars 数组来记录字符串 t 中各字符的出现次数。然后,使用左右指针 leftright 来维护滑动窗口,同时也维护变量 remaining 来表示 t 中未被覆盖的字符数。在循环中,不断向右移动 right 指针,直到覆盖了所有 t 中的字符,然后向右移动 left 指针来尽量缩小子串的长度。最终,返回找到的最小子串。

这个算法的时间复杂度是 O(S + T),其中 S 是字符串 s 的长度,T 是字符串 t 的长度。

 python 代码

from collections import Counter

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        target_counts = Counter(t)
        required_chars = len(target_counts)
        left, right = 0, 0
        min_length = float('inf')
        min_window = ""
        
        while right < len(s):
            if s[right] in target_counts:
                target_counts[s[right]] -= 1
                if target_counts[s[right]] == 0:
                    required_chars -= 1
            
            while required_chars == 0:
                if right - left + 1 < min_length:
                    min_length = right - left + 1
                    min_window = s[left:right+1]
                
                if s[left] in target_counts:
                    target_counts[s[left]] += 1
                    if target_counts[s[left]] > 0:
                        required_chars += 1
                
                left += 1
            
            right += 1
        
        return min_window

 C++代码

#include <string>
#include <unordered_map>
#include <climits>

class Solution {
public:
    std::string minWindow(std::string s, std::string t) {
        std::unordered_map<char, int> target_counts;
        int required_chars = t.length();
        int left = 0, right = 0;
        int min_length = INT_MAX;
        int min_start = 0;
        
        for (char c : t) {
            target_counts[c]++;
        }
        
        while (right < s.length()) {
            if (target_counts.find(s[right]) != target_counts.end()) {
                target_counts[s[right]]--;
                if (target_counts[s[right]] >= 0) {
                    required_chars--;
                }
            }
            
            while (required_chars == 0) {
                if (right - left + 1 < min_length) {
                    min_length = right - left + 1;
                    min_start = left;
                }
                
                if (target_counts.find(s[left]) != target_counts.end()) {
                    target_counts[s[left]]++;
                    if (target_counts[s[left]] > 0) {
                        required_chars++;
                    }
                }
                
                left++;
            }
            
            right++;
        }
        
        if (min_length == INT_MAX) {
            return "";
        }
        
        return s.substr(min_start, min_length);
    }
};

这段代码使用了C++的std::unordered_map来统计字符串t中每个字符的频率。然后,通过滑动窗口算法,在字符串s上移动左右指针,维护一个窗口,确保窗口内包含了字符串t中的所有字符。当窗口包含了所有t中的字符时,通过比较窗口长度来更新最小子串的起始和结束位置。最后,返回最小子串。文章来源地址https://www.toymoban.com/news/detail-738952.html

到了这里,关于LeetCode----76. 最小覆盖子串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (滑动窗口) 76. 最小覆盖子串 ——【Leetcode每日一题】

    难度:困难 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 \\\"\\\" 。 注意: 对于 t 中 重复字符 ,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们

    2024年02月08日
    浏览(48)
  • leetcode(力扣) 76. 最小覆盖子串 (滑动窗口,超详细问答版解析)

    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是

    2024年02月08日
    浏览(52)
  • 【leetcode题解C++】51.N皇后 and 76.最小覆盖子串

    51. N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题  研究的是如何将  n  个皇后放置在  n×n  的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数  n  ,返回所有不同的  n   皇后问题  的解决方案。 每一种

    2024年02月20日
    浏览(43)
  • LeetCode热题HOT100:76. 最小覆盖子串,84.柱状图中最大的矩形、96. 不同的二叉搜索树

    题目 :给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保

    2023年04月19日
    浏览(69)
  • 每日OJ题_算法_滑动窗口⑧_力扣76. 最小覆盖子串

    目录 力扣76. 最小覆盖子串 解析及代码 76. 最小覆盖子串 - 力扣(LeetCode) 难度 困难 给你一个字符串  s  、一个字符串  t  。返回  s  中涵盖  t  所有字符的最小子串。如果  s  中不存在涵盖  t  所有字符的子串,则返回空字符串  \\\"\\\"  。 注意: 对于  t  中重复字符,

    2024年01月23日
    浏览(42)
  • 76. 最小覆盖子串

    76. 最小覆盖子串 滑动窗口 两个 Integer 相等比较应该用 equals,而不是 ==。 一个 Integer 和一个 int 比较,Integer 会自动拆箱,可以用 ==。

    2024年02月06日
    浏览(39)
  • 力扣:76. 最小覆盖子串(Python3)

    给你一个字符串  s  、一个字符串  t  。返回  s  中涵盖  t  所有字符的最小子串。如果  s  中不存在涵盖  t  所有字符的子串,则返回空字符串  \\\"\\\"  。 注意: 对于  t  中重复字符,我们寻找的子字符串中该字符数量必须不少于  t  中该字符数量。 如果  s  中存在

    2024年02月11日
    浏览(36)
  • 算法刷题:最小覆盖子串

    最小覆盖子串 这道题的要求是在s字符串中找到包含t字符串中所有字母的子串,并要求找到长度最小的,很显然,这道题适合用滑动窗口来解决 双指针的初始值都为0 定义hash表记录t和窗口中的字母个数 定义变量统计t和窗口内的有效字母种类 有效字母种类: 窗口内hash某个字母的

    2024年03月10日
    浏览(42)
  • 算法leetcode|64. 最小路径和(rust重拳出击)

    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明 :每次只能向下或者向右移动一步。 m == grid.length n == grid[i].length 1 = m, n = 200 0 = grid[i][j] = 200 面对这道算法题目,二当家的再次陷入了沉思。 这道题和62. 不同

    2024年02月15日
    浏览(47)
  • 【算法|动态规划No.17】leetcode64. 最小路径和

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包