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

LeetcodeHot100|76.最小覆盖子串

76.最小覆盖子串

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

遇到的问题

  1. 找出所有符合条件的字段,然后统计长度。统计abc字符出现的次数,这种方法的问题是?

  2. 如何统计各个字符出现的次数?


fig1

思路分析

这种题目一般使用滑动窗口来实现这个问题,在这种问题中一般会有两个指针,一个指针r用于窗口的扩展

,一个l用于收缩窗口的l指针。在任意时刻,一个指针运动,另一个保持禁止。所有回到题目,在字符s上不断移动,通过指针r不断扩张窗口,当包含t全部的字符之后,如果能收缩就收缩到不能收缩为止,也就是得到最小窗口。

题目解答

#include <unordered_map>
#include <climits>
#include <string>
using namespace std;class Solution {
public:// ori:存储目标字符串t中各字符的出现次数(基准哈希表)// cnt:存储当前滑动窗口中各字符的出现次数(动态哈希表)unordered_map<char, int> ori, cnt;// 检查当前滑动窗口是否包含目标字符串t的所有字符,且各字符数量不小于t中的数量bool check() { // 遍历目标哈希表ori中的每个字符for (const auto &p : ori) { // 如果当前窗口中该字符的数量小于目标数量,说明窗口不满足条件if (cnt[p.first] < p.second) { return false;}}// 所有字符都满足数量要求,窗口有效return true; }// 寻找s中包含t所有字符的最小长度子串string minWindow(string s, string t) {// 初始化目标哈希表ori:统计t中每个字符的出现次数for (const auto &c : t) { ++ori[c];}// l:滑动窗口左边界,r:滑动窗口右边界(初始化为-1,方便首次++r指向0)int l = 0, r = -1; // len:当前找到的最小窗口长度(初始化为最大值)// ansL:最小窗口的起始索引,ansR:最小窗口的结束索引(初始化为-1表示未找到)int len = INT_MAX, ansL = -1, ansR = -1; // 右指针遍历整个字符串s(当r小于s长度时持续循环)while (r < int(s.size())) { // 右指针右移一位(首次循环会从-1移到0)// 如果当前字符是t中包含的字符(存在于ori中),则在cnt中增加其计数if (ori.find(s[++r]) != ori.end()) { ++cnt[s[r]];}// 当窗口满足条件(包含t所有字符),且左指针不超过右指针时,尝试收缩左边界以寻找更小窗口while (check() && l <= r) { // 计算当前窗口长度,若小于已知最小长度,则更新最小长度和窗口索引if (r - l + 1 < len) { len = r - l + 1;ansL = l; // 记录当前窗口的起始位置}// 如果左边界字符是t中包含的字符,移除它时需要减少cnt中的计数if (ori.find(s[l]) != ori.end()) { --cnt[s[l]];}// 左指针右移,收缩窗口++l;}}// 如果未找到有效窗口(ansL仍为-1),返回空字符串;否则返回最小窗口子串return ansL == -1 ? string() : s.substr(ansL, len);}
};

看完题解后

  1. for (const auto &p : ori) {这里使用const 以及&的目标是?可以不用吗
    • 避免拷贝ori 是一个 unordered_map<char, int>,其中的元素是 pair<char, int> 类型。如果不用引用(即写成 for (auto p : ori)),每次循环都会将 ori 中的元素拷贝一份到 p 中。对于哈希表中的每个元素,拷贝操作会额外消耗时间(尤其是当哈希表很大时,性能影响更明显)。
    • 直接访问原元素:使用引用 &p 可以直接访问 ori 中的元素,无需拷贝,提高循环效率。
http://www.dtcms.com/a/606304.html

相关文章:

  • GPIO中断实现流程
  • 佛山市骏域网站建设专家微信公众号登录平台入口官网
  • 38nginx四层负载均衡配置,和动静分离解析
  • 深入理解C语言内存管理:从栈、堆到内存泄露与悬空指针
  • 如何免费做网站网页宁波模板建站哪家好
  • 最传统的网站推广手段公司网络优化方案
  • 广州市规划建设局网站佛山制作网站企业
  • mysql索引——理解索引机制及操作
  • 门户网站如何做seowordpress资源网模板
  • MySQL事务隔离级别:从并发困境到架构革新
  • 开发手机网站教程网页布局类型有哪些
  • 万峰科技.jsp网站开发四酷全书[m]seo收费还是免费
  • Linux:基础开发工具(二)
  • 小白教程:在 Windows 中启用 WSL 并安装 Linux 发行版
  • Linux RTC 驱动子系统详细实现方案
  • 主流服务器免费 SSL 证书部署手册 + 混合内容排查指南
  • Linux SNMP 团体号配置指定IP地址访问
  • 酒店移动网站建设方案wordpress添加导航栏
  • 大模型知识蒸馏实战:从Qwen-72B到Qwen-7B的压缩艺术
  • CMake Error at fc_base/gflags-src/CMakeLists.txt:73
  • 做一个网站需要多少人发布网站建设需求的经验
  • 网站开发多少工资做网站编辑好还是美工好
  • 上海网站建设公司四叶互联邗江区建设局网站
  • pytorch-张量转换
  • 推广型网站建设机构甘肃业聚质网络科技有限公司
  • 怎么让同一个局域网上的计算机看到我做的网站以公司名称为后缀的邮箱
  • Java接口与抽象类深度指南:从原理到实战
  • 人工智能备考——2.1.4题解
  • 做淘宝网站需要什么邵阳市城市建设网站
  • 告别闭门造车:用竞品ASO分析驱动应用下载转化