LeetCode 76 最小覆盖字串

LeetCode 76 最小覆盖字串

在本篇博客中,我们将探讨LeetCode上的一道算法题目------"最小覆盖子串"。这道题的主要目标是找到字符串s中包含字符串t中所有字符的最小子串。

问题描述

给定字符串s和t,要求在字符串s中找到一个最小的子串,使得这个子串包含了字符串t中所有的字符。如果不存在这样的子串,返回空字符串""。

解题思路

要解决这个问题,我们可以使用滑动窗口的方法。滑动窗口是一种经典的算法思想,在处理子串、子数组等问题时非常有效。

具体地,我们可以按照以下步骤进行:

  1. 创建两个哈希表,一个用于存储字符串t中每个字符的出现次数,另一个用于存储当前窗口中每个字符的出现次数。
  2. 使用两个指针,j指向窗口的左边界,i指向窗口的右边界 j和i初始化为0。
  3. 遍历字符串s,移动i。
  4. 缩小窗口,移动j,尽量减小窗口大小同时保证包含字符串t中所有字符。
  5. 在遍历过程中,更新最小子串的起始位置和长度。

实现代码

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char, int> map, _map;
        string result;

        // 将要查找的字符放入到哈希表中
        for (auto i : t) map[i]++;

        // j左 i右
        for (int i = 0, j = 0, count = 0; i < s.length(); i++) {
            // 如果_map中加入字符后数量没有超过map,说明是一个有效字符
            if (++_map[s[i]] <= map[s[i]]) count++;

            // 缩小窗口
            while (_map[s[j]] > map[s[j]]) _map[s[j++]]--;

            // 当窗口包含了t中所有字符时,更新最小子串
            if (count == t.length()) {
                if (result.empty() || result.size() > i - j + 1)
                    result = s.substr(j, i - j + 1);
            }
        }

        return result;
    }
};

复杂度分析

时间复杂度分析

  • 遍历字符串s: 算法的主要部分是对字符串s进行一次线性遍历,因此时间复杂度为O(n),其中n是字符串s的长度。
  • 内部循环: 内部循环中包含了两个指针的移动,它们的时间复杂度取决于指针的移动次数。在最坏情况下,每个指针都可能移动n次,因此内部循环的时间复杂度也是O(n)。
  • 哈希表操作: 哈希表的操作在最坏情况下可以达到O(1)的时间复杂度,因此哈希表的操作不会对总体复杂度造成影响。

综上所述,算法的时间复杂度为O(n)。

空间复杂度分析

  • 哈希表的空间复杂度: 算法中使用了两个哈希表,它们存储的键值对数量不会超过字符串t的长度,因此哈希表的空间复杂度为O(|t|),其中|t|是字符串t的长度。
  • 额外空间: 除了哈希表之外,算法只使用了常数级别的额外空间,因此不会对总体空间复杂度造成影响。

综上所述,算法的空间复杂度为O(|t|)。

总结

本文介绍了如何利用滑动窗口的思想解决LeetCode中的"最小覆盖子串"问题。通过使用两个哈希表记录字符出现次数,以及通过移动左右指针来确定子串的位置,我们可以高效地找到问题的解决方案。滑动窗口是一种在处理子串问题时非常有用的算法思想,可以帮助我们解决各种相关的问题。

相关推荐
xlp666hub27 分钟前
Leetcode第七题:用C++解决接雨水问题
c++·leetcode
CoovallyAIHub1 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub2 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
颜酱13 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone773919 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub21 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub21 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙1 天前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法