news 2026/6/23 7:36:15

【每日算法】LeetCode 76. 最小覆盖子串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日算法】LeetCode 76. 最小覆盖子串

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 76. 最小覆盖子串

1. 题目描述

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

注意:

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

示例:

  • 输入:s = "ADOBECODEBANC",t = "ABC"
  • 输出:"BANC"
  • 解释:最小子串 “BANC” 包含 ‘A’、‘B’ 和 ‘C’。

2. 问题分析

这是一个典型的子串覆盖问题,需要从字符串s中找到最短的连续子串,使得该子串包含字符串t的所有字符(包括重复字符)。问题本质是优化搜索过程,避免枚举所有子串。

前端视角:在前端开发中,类似场景包括用户输入过滤(如搜索框自动完成)、文本高亮匹配或动态内容渲染,其中需要高效处理字符串以提供实时响应。

3. 解题思路

3.1 暴力法(Brute Force)

枚举s的所有子串,检查每个子串是否覆盖t,并记录最小长度。这种方法简单但效率低下,不适用于长字符串。

复杂度:

  • 时间复杂度:O(n^3),其中 n 是s的长度(枚举子串 O(n^2),检查覆盖 O(n))。
  • 空间复杂度:O(m),用于存储t的字符计数,m 是t中字符集大小。

3.2 滑动窗口法(Sliding Window,最优解)

使用两个指针leftrights上定义窗口,通过移动指针动态调整窗口大小。用哈希表记录字符需求,确保窗口覆盖t的所有字符。

步骤:

  1. 初始化哈希表need,记录t中每个字符所需数量。
  2. 使用left = 0right = 0滑动窗口,valid计数满足需求的字符种类数。
  3. 扩展right指针,增加窗口,直到窗口覆盖t
  4. 收缩left指针,缩小窗口,同时更新最小子串。
  5. 重复直到right到达s末尾。

复杂度:

  • 时间复杂度:O(n),其中 n 是s的长度,每个字符最多被访问两次。
  • 空间复杂度:O(m),用于哈希表存储,m 是字符集大小(如 ASCII 为 128)。

最优解:滑动窗口法是最优解,因为它在线性时间内解决问题。

4. 各思路代码实现

4.1 暴力法实现(JavaScript)

functionminWindowBruteForce(s,t){if(s.length<t.length)return"";constneed=newMap();for(letcharoft){need.set(char,(need.get(char)||0)+1);}letminLen=Infinity,minStr="";for(leti=0;i<s.length;i++){for(letj=i+t.length;j<=s.length;j++){constsubstr=s.substring(i,j);if(isCover(substr,newMap(need))){if(substr.length<minLen){minLen=substr.length;minStr=substr;}break;// 找到覆盖就跳出内层循环,因为继续扩展只会更长}}}returnminStr;}functionisCover(substr,need){for(letcharofsubstr){if(need.has(char)){need.set(char,need.get(char)-1);if(need.get(char)===0)need.delete(char);}}returnneed.size===0;}// 测试console.log(minWindowBruteForce("ADOBECODEBANC","ABC"));// 输出 "BANC"

4.2 滑动窗口法实现(JavaScript,最优解)

functionminWindow(s,t){if(s.length<t.length)return"";constneed=newMap();constwindow=newMap();for(letcharoft){need.set(char,(need.get(char)||0)+1);}letleft=0,right=0;letvalid=0;// 满足需求的字符种类数letstart=0,minLen=Infinity;while(right<s.length){constchar=s[right];right++;// 更新窗口数据if(need.has(char)){window.set(char,(window.get(char)||0)+1);if(window.get(char)===need.get(char)){valid++;}}// 当窗口覆盖 t 时,收缩左侧while(valid===need.size){// 更新最小子串if(right-left<minLen){minLen=right-left;start=left;}constleftChar=s[left];left++;if(need.has(leftChar)){if(window.get(leftChar)===need.get(leftChar)){valid--;}window.set(leftChar,window.get(leftChar)-1);}}}returnminLen===Infinity?"":s.substring(start,start+minLen);}// 测试console.log(minWindow("ADOBECODEBANC","ABC"));// 输出 "BANC"console.log(minWindow("a","aa"));// 输出 ""

5. 各实现思路的复杂度、优缺点对比表格

思路时间复杂度空间复杂度优点缺点适用场景
暴力法O(n^3)O(m)实现简单,易于理解效率极低,不适用于长字符串小规模数据或教学示例
滑动窗口法O(n)O(m)高效,线性时间解决实现稍复杂,需维护状态实际应用,如前端实时处理

6. 总结

LeetCode 76. 最小覆盖子串问题展示了滑动窗口算法的强大之处,它将复杂问题优化到线性时间。对于前端开发者,掌握此类算法不仅提升面试竞争力,更能应用于实际场景:

  • 实际应用场景
    • 搜索框自动完成:快速匹配用户输入的子串,提供实时建议。
    • 文本编辑器高亮:在长文档中高效查找并高亮关键词。
    • 数据过滤:在前端处理大型列表或字符串数据时,动态过滤覆盖特定模式的内容。
    • 性能优化:减少不必要的DOM操作或计算,确保用户界面流畅响应。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 12:07:04

5个立竿见影的wgpu性能优化技巧:让你的Rust图形应用帧率翻倍

还在为wgpu图形应用的卡顿问题而烦恼吗&#xff1f;作为跨平台纯Rust图形API&#xff0c;wgpu凭借其安全特性和硬件加速能力正成为游戏引擎、数据可视化等领域的首选方案。本文将从实际应用角度出发&#xff0c;分享5个简单易行的性能优化策略&#xff0c;让你在短时间内显著提…

作者头像 李华
网站建设 2026/6/23 0:38:08

1000 人并发 + 4K 高清,3 大行业案例见证协作效率翻倍

在远程办公常态化、业务场景多元化的今天&#xff0c;网易云信音视频通话已成为企业打破沟通壁垒、提升协作效率的核心支撑。根据艾瑞咨询《2025年企业通信协作趋势报告》显示&#xff0c;超72%的企业将音视频通话能力列为数字化转型的“刚需配置”&#xff0c;但仅有35%的企业…

作者头像 李华
网站建设 2026/6/23 16:06:46

字符串的拼接函数:strcat()

一、strcat () 函数介绍strcat()&#xff08;string concatenation&#xff0c;字符串拼接&#xff09;是 C 语言标准库<string.h>中的函数&#xff0c;用于将一个字符串追加&#xff08;拼接&#xff09;到另一个字符串的末尾&#xff0c;覆盖目标字符串原有的结束符\0&…

作者头像 李华
网站建设 2026/6/23 3:36:23

GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程

GraphRAG-Local-UI是一个功能强大的本地化知识图谱构建工具&#xff0c;它基于微软GraphRAG项目开发&#xff0c;支持使用本地语言模型进行智能数据索引和查询。这个项目为开发者提供了一个完整的生态系统&#xff0c;让你能够在本地环境中构建、管理和查询复杂的知识图谱&…

作者头像 李华
网站建设 2026/6/21 1:47:53

Messari:Flow 生态 2025 年 Q3 发展概览

TL&DRForte 公共测试网已正式上线&#xff0c;支持 Actions、Agents 与 Scheduled Transactions&#xff0c;为开发者提供了原生的链上定时执行工具&#xff0c;使计划性链上操作成为协议级能力。Flow 的 DeFi 总锁仓量&#xff08;TVL&#xff09;环比增长 53.1%&#xff…

作者头像 李华
网站建设 2026/6/20 15:49:12

Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践

Draft.js工具栏深度定制&#xff1a;构建企业级富文本编辑器的完整实践 【免费下载链接】draft-js A React framework for building text editors. 项目地址: https://gitcode.com/gh_mirrors/dra/draft-js 在当今内容驱动的互联网时代&#xff0c;富文本编辑器已成为各…

作者头像 李华