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

滑动窗口-76.最小覆盖子串-力扣(LeetCode)

一、题目解析

1.不符合要求则返回空串("")

2.子串中重复字符的数量要不少于t中该字符的数量

二、算法原理

解法1:暴力枚举+哈希表

这里的暴力枚举也可以优化,即在包含t中元素处枚举,如在A、B和C处开始枚举,减少不必要的枚举 

解法2:滑动窗口+哈希表+check函数判断

why?为什么能使用滑动窗口

 能观察出left和right同向移动,left和right的间距就像一个窗口一样,框出符合要求的字符串

how?如何实现滑动窗口?

1.定义left和right
2.check函数:判断s的哈希表包含的元素是否大于等于t的哈希表
3.进窗口->hash2[in]++
4.判断->check(hash1,hash2)
5.更新结果->更新结果需要记录起始位置和最短长度
        出窗口->hash2[out]--

解法3:滑动窗口+哈希表+count变量优化判断条件

对于check()函数,需要遍历两个哈希表所以元素,所以可以通过count来记录有效字符的种类,通过维护count来实现简便判断

1.进窗口->进窗口之后,当hash1[in] == hash2[in]时,count++

2.出窗口->出窗口之前,当hash1[out] == hash2[out]时,count--

3.判断条件->当count == kinds(t中有效元素的个数)

在理解why后,可以先解法2,然后再去尝试解法3

三、代码示例

解法2:

bool check(int hash2[], int hash1[]){for (int i = 'A'; i <= 'Z'; i++) {if (hash2[i] < hash1[i]) return false;}for (int i = 'a'; i <= 'z'; i++) {if (hash2[i] < hash1[i]) return false;}return true;}public:string minWindow(string s, string t) {int hash2[128]={0}; // s 子串字母的出现次数int hash1[128]={0}; // t 中字母的出现次数for (char c : t) {hash1[c]++;}int m = s.size();int minlen = INT_MAX,begin = -1;for (int left = 0,right = 0; right < m; right++) {hash2[s[right]]++; // 右端点字母移入子串while (check(hash2, hash1)) { // 涵盖if (right - left +1< minlen) { // 找到更短的子串minlen = right-left+1;begin = left;}hash2[s[left]]--; // 左端点字母移出子串left++;}}return begin < 0 ? "" : s.substr(begin, minlen);}
};

 

解法3:

string minWindow(string s, string t){int hash1[128] = {0};//统计字符串t中每一个字符的频次int kinds = 0;//统计有效字符由多少种for(auto ch : t)if(hash1[ch]++ == 0) kinds++;int hash2[128] = {0};//统计窗口内每个字符的频次int minlen = INT_MAX,begin = -1;for(int left = 0,right = 0,count = 0;right<s.size();right++){char in = s[right];if(++hash2[in] == hash1[in]) count++;//进窗口+维护countwhile(count == kinds){if(right-left+1<minlen){minlen = right-left+1;begin = left;}char out = s[left++];if(hash2[out]-- == hash1[out]) count--;}}if(begin == -1) return "";else return s.substr(begin,minlen);}

 

 

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见! 

 

http://www.xdnf.cn/news/1115065.html

相关文章:

  • 【保姆级图文详解】MCP架构(客户端-服务端)、三种方式使用MCP服务、Spring AI MCP客户端和服务端开发、MCP部署方案、MCP安全性
  • 【Datawhale夏令营】用AI做带货视频评论分析
  • Spring-----MVC配置和基本原理
  • QCustomPlot绘图保存成PDF文件
  • office-ai整合excel
  • 特征选择方法
  • 数据库3.0
  • Java SE--图书管理系统模拟实现
  • PHP语法高级篇(二):文件处理
  • JVM 锁自动升级机制详解
  • 【AI论文】GLM-4.1V-Thinking:迈向具备可扩展强化学习的通用多模态推理
  • Java面试基础:面向对象(2)
  • 数学与应用数学核心课程有哪些?全文解析!
  • 【webrtc】gcc当前可用码率2:设置阈值通知码率改变
  • 梯度下降算法:像下山一样找到最优解
  • Linux驱动开发1:设备驱动模块加载与卸载
  • ControlNet与T2IAdapter
  • 三种网络类型
  • WordPress Ads-pro 本地文件包含漏洞复现(CVE-2025-4380)
  • 设计模式之工厂模式:对象创建的智慧之道
  • 从“被动巡检”到“主动预警”:塔能物联运维平台重构路灯管理模式
  • Docker安装Nginx
  • Leaflet面试题及答案(61-80)
  • 全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)
  • Gin框架统一响应与中间件机制学习笔记
  • JAVA-springboot 整合Activemq
  • Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)脚步
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • Docker三剑客