当前位置: 首页 > news >正文

LeetCode 76题「最小覆盖子串」

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

题目分析

输入:字符串 st(均由英文字母组成)
输出s 中包含 t 所有字符的最小子串,若不存在则返回空字符串
条件

  1. 子串需包含 t 的所有字符(包括重复字符)
  2. 若有多个符合条件的子串,返回长度最小的
  3. 时间复杂度尽量优化

解题思路

这道题可以使用滑动窗口算法结合哈希表来解决:

  1. 统计字符频率:使用哈希表统计 t 中每个字符的出现次数。
  2. 滑动窗口初始化:使用左右指针 leftright 表示窗口边界,初始均指向 s 的起始位置。
  3. 扩展窗口:右指针 right 向右移动,不断扩大窗口,直到窗口包含 t 的所有字符。
  4. 收缩窗口:当窗口满足条件时,尝试收缩左指针 left,尽可能缩小窗口大小,同时记录最小窗口的位置和长度。
  5. 重复步骤3-4:直到右指针遍历完整个字符串 s

算法实现

以下是使用C++实现的代码:

#include <string>
#include <unordered_map>
#include <climits>
using namespace std;string minWindow(string s, string t) {if (s.empty() || t.empty() || s.size() < t.size()) return "";// 统计t中各字符的出现次数unordered_map<char, int> target;for (char c : t) target[c]++;int required = target.size();  // 需要匹配的字符种类数// 滑动窗口初始化int left = 0, right = 0;int formed = 0;  // 当前窗口中已完全匹配的字符种类数unordered_map<char, int> window;  // 窗口中各字符的出现次数// 记录最小窗口的位置和长度int min_len = INT_MAX;int min_left = 0;while (right < s.size()) {// 扩展窗口,加入右侧字符char c = s[right];window[c]++;// 检查当前字符是否在t中,且窗口中的出现次数达到要求if (target.find(c) != target.end() && window[c] == target[c]) {formed++;}// 尝试收缩窗口while (left <= right && formed == required) {c = s[left];// 更新最小窗口if (right - left + 1 < min_len) {min_len = right - left + 1;min_left = left;}// 移出左侧字符window[c]--;if (target.find(c) != target.end() && window[c] < target[c]) {formed--;}left++;}right++;}return min_len == INT_MAX ? "" : s.substr(min_left, min_len);
}

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 是字符串 s 的长度。左右指针最多各遍历一次 s
  • 空间复杂度 O ( k ) O(k) O(k),其中 k k k 是字符串 t 中不同字符的个数。主要用于存储哈希表。

关键点解释

  1. 哈希表 target:记录 t 中每个字符的出现次数。
  2. 变量 required:表示需要匹配的不同字符数(即 target 的大小)。
  3. 变量 formed:记录当前窗口中已完全匹配的不同字符数。
  4. 收缩窗口的条件:当 formed == required 时,表示当前窗口已包含 t 的所有字符,此时尝试收缩窗口以找到最小子串。

通过这种方法,可以高效地在 s 中找到包含 t 所有字符的最小子串。

相关文章:

  • 从零基础到最佳实践:Vue.js 系列(8/10):《性能优化与最佳实践》
  • Spring AI 之提示词
  • 论文解读 | 《桑黄提取物对小鼠宫颈癌皮下移植瘤的抑制及机制研究》
  • 红黑树插入的旋转变色
  • 使用C语言实现字符串拷贝与程序编译全解析 ——从strcopy实现到程序内存布局,一文掌握核心知识
  • FPGA通信之VGA
  • 【结构体宏定义】C语言结构体与宏定义:传感器配置的巧妙结合
  • transformer网络
  • 全栈开发中主流 AI 编程辅助工具的实践与对比分析20250522
  • thinkpad x220降频到0.7Ghz解决办法
  • 小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下
  • Python 训练 day31
  • Python打卡训练营day32
  • 改写文章打造原创内容,ai智能改写工具在线高效完成!
  • 点云技术原理概要
  • Oracle 的V$ACTIVE_SESSION_HISTORY 视图
  • 大语言模型 18 - MCP Model Context Protocol 基本项目 测试案例
  • 技术篇-2.3.Golang应用场景及开发工具安装
  • 数巅智能亮相中国石油石化企业信息技术交流大会 以大模型能力驱动能源行业数智化升级
  • AIGC消除软件概览:优化内容创作的新工具
  • 宝鸡网站建设哪家好/房地产销售工作内容
  • 信誉好的龙岗网站建设/seo服务深圳
  • 这么做简单的网站/网站优化流程
  • 软件工程在网站建设/域名查询服务器
  • 网站建设中效果/武汉网站seo德升
  • 胶州网站建设哪家好/沈阳网页建站模板