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

leetcode76. 最小覆盖子串(传引用 unordered_map的慢 可以用数组来代替哈希表)

解法1

class Solution{
bool is_covered(unordered_map<int,int>&cnt_s,unordered_map<int,int>&cnt_t){for(int i='A';i<='Z';i++){if(cnt_s[i]<cnt_t[i])return false;}for(int i='a';i<='z';i++){if(cnt_s[i]<cnt_t[i])return false;}return true;
}    //检查这个s是不是可以覆盖t
public:
string minWindow(string s, string t) {unordered_map<int,int>cnt_s,cnt_t;int left=0,m=s.length(),temp_left=-1,temp_right=m,ans=INT_MAX;for(char i:t)cnt_t[i]++;for(int i=0;i<m;i++){cnt_s[s[i]]++;while(is_covered(cnt_s,cnt_t)){if(i-left+1<temp_right-temp_left+1){temp_left=left;temp_right=i;}cnt_s[s[left]]--;left++;}}return (temp_left<0?"":s.substr(temp_left,temp_right-temp_left+1));
}
};

解法2

class Solution2 {bool is_covered(int cnt_s[], int cnt_t[]) {for (int i = 'A'; i <= 'Z'; i++) {if (cnt_s[i] < cnt_t[i]) {return false;}}for (int i = 'a'; i <= 'z'; i++) {if (cnt_s[i] < cnt_t[i]) {return false;}}return true;}public:string minWindow(string s, string t) {int cnt_s[128]{}; // s 子串字母的出现次数int cnt_t[128]{}; // t 中字母的出现次数
//用数组更快for (char c : t) {cnt_t[c]++;}int m = s.size();int ans_left = -1, ans_right = m;int left = 0;for (int right = 0; right < m; right++) { // 移动子串右端点cnt_s[s[right]]++; // 右端点字母移入子串while (is_covered(cnt_s, cnt_t)) { // 涵盖if (right - left < ans_right - ans_left) { // 找到更短的子串ans_left = left; // 记录此时的左右端点ans_right = right;}cnt_s[s[left]]--; // 左端点字母移出子串left++;}}return ans_left < 0 ? "" : s.substr(ans_left, ans_right - ans_left + 1);}
};

解法2优化

这个优化的方案是,上一个解法每次都要花费时间去看是不是is_covered,也就是O(52),我们可以直接维护一个less,表示t中没有出现过的字符的种类

class Solution3{
public:string minWindow(string s,string t){int cnt[128]{};int less=0,m=s.length(),temp_left=-1,temp_right=m,left=0;for(char&i:t){if(cnt[i]==0)less++;cnt[i]++;}for(int right=0;right<m;right++){cnt[s[right]]--;//如果这个字符在t中没有出现过的话,那么就会变成-1,因为刚开始大家都是0if(cnt[s[right]]==0)less--;//如果这个字母的数量现在跟t中的一样的话,那么代表种类的less就减去1,当less等于1的时候,代表t中的字母已经被覆盖了while(less==0){if(right-left+1<temp_right-temp_left+1){temp_right=right;temp_left=left;}if(cnt[s[left]]==0)less++;//如果这个cnt==0说明是t中的字符,这个字符现在//出这个窗口了cnt[s[left]]++;left++;}}return (temp_left<0?"":s.substr(temp_left,temp_right-temp_left+1));}
};
http://www.jsqmd.com/news/440226/

相关文章:

  • 网易智企肖钰妍:未来三年,服务营销领域 Agent 五大趋势预测
  • 2026省选邮寄
  • 软件开发创新日志 #1项目分析+二次开发
  • BurpSuite安装教程
  • 2026年比较好的疲劳试验机厂家推荐:电动伺服疲劳试验机/橡胶弹性体疲劳试验机/山东橡胶弹性体疲劳试验机专业制造厂家推荐 - 品牌宣传支持者
  • 函数栈帧的创建与销毁
  • 2026年靠谱的阻燃硅橡胶品牌推荐:胶辊硅橡胶/抗静电硅橡胶/自润滑硅橡胶口碑好的厂家推荐 - 品牌宣传支持者
  • AI 基础概念
  • 通过计算重用提取内在潜在内存FlashMem: Distilling Intrinsic Latent Memory via Computation Reuse
  • 2026年评价高的风力选煤设备厂家推荐:智能干选选煤设备/煤炭提质选煤设备厂家推荐哪家好 - 品牌宣传支持者
  • 晶圆寻边器厂家哪家靠谱?能适配8-12寸晶圆且精度达±0.1mm吗?
  • Git 中 提交(commit)和 合并(merge)的区别
  • 零基础中医执医技能操作怎么练?深度测评阿虎医考 - 医考机构品牌测评专家
  • 简单说明,轻松搞懂 ,AI混剪,AI智能成片有什么区别
  • 该套程序是正压检漏机程序,总共有9个 A6总线伺服电机,6个总线步进电机,采用EtherCAT...
  • 2026年靠谱的聚脲水箱工厂推荐:喷涂聚脲体育看台/天冬聚脲屋顶防水专业制造厂家推荐 - 品牌宣传支持者
  • Flutter 三方库 firebase_dart 的鸿蒙化适配指南 - 纯 Dart 实现的 Firebase 客户端、告别原生 SDK 依赖、鸿蒙级实时数据库与鉴权实战
  • 2026年评价高的定速式摩擦磨损试验机厂家推荐:山东直线往复摩擦磨损试验机实力工厂推荐 - 品牌宣传支持者
  • 2026年口碑好的环保选煤设备工厂推荐:煤炭提质选煤设备/新型多级风力选煤设备值得信赖的生产厂家 - 品牌宣传支持者
  • 2026年靠谱的称重包装机厂家推荐:注塑件称重包装机/全自动称重包装机/精密部件称重包装机实力品牌厂家推荐 - 品牌宣传支持者
  • 深入解析:C语言——动态内存管理
  • 零基础备考医考,培训机构到底怎么选? - 医考机构品牌测评专家
  • 状压-dp
  • 【2026实测】OBS Studio直播软件完全指南:零基础打造高清直播间(附安装包) - xiema
  • 矩阵相关
  • 临床执业医师培训机构哪个好?特别实用指南来了 - 医考机构品牌测评专家
  • 2026年比较好的GEO品牌推荐:GEO招商/GEO公司/GEO系统可靠推荐企业 - 品牌宣传支持者
  • 中医执医培训机构实测推荐:高通过率、好服务、课程优怎么选? - 医考机构品牌测评专家
  • CRMEB连锁多门店系统 v4.0更新预告:连锁门店分账,从手动挡升级自动挡!
  • OpenClaw 爆火之后,我们给出了企业级答案