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

力扣 最小覆盖子串

最小覆盖子串

https://leetcode.cn/problems/minimum-window-substring/

题目描述

在这里插入图片描述

题目分析f

覆盖子串:首先根据题意,要求目标字符串的元素必须都在子串中出现过,这表明可以是乱序出现。所以在解决问题是我们需要对子串和目标字符串做匹配,查看子串是否符合要求。
∀ s ∈ S t s . t . s ∈ A n s \begin{align} \forall &s \in \boldsymbol{S_t} \\s.t. \qquad &s \in \boldsymbol{Ans}\end{align} s.t.sStsAns
比较朴素的思路:采用遍历的方法查看是否任意 s ∈ S t s \in \boldsymbol{S_t} sSt都在 A n s \boldsymbol{Ans} Ans
更好的方法:通过某种表示手段表示子串和目标字符串从而判断 A n s \boldsymbol{Ans} Ans是否覆盖 S t \boldsymbol{S_t} St(表示方法判断的复杂度应是 O ( 1 ) O(1) O(1)

题目解决

根据题目提示,确定使用滑动窗口的办法。两个注意点,窗口扩大和窗口缩小
当窗口扩大时注意是否满足条件,当满足条件时尝试缩小窗口。注意每当满足条件时,更新最优窗口大小。

遍历覆盖比较法

当满足覆盖时,缩小窗口,一个个判断
代码

class Solution {
public: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;}string minWindow(string s, string t) {int slen = s.size(), tlen = t.size();string ans;if(slen < tlen) return ans;int ansleft = -1, ansright = slen;int cntwind[128] = {0}, cntt[128]={0};for(char &c : t){++cntt[c];}int left = 0;for(int right = 0; right < slen; ++right){++cntwind[s[right]];while(is_covered(cntwind, cntt)){if(right - left < ansright - ansleft){ansleft = left;ansright = right;}--cntwind[s[left]];++left;}   }return ansleft < 0 ? "" : s.substr(ansleft, ansright - ansleft + 1);}
};

表示覆盖比较法

通过预先设定窗口表示—— C u ( S t ) C_u(S_t) Cu(St)
通过种类,个数的方法表示是否覆盖
实际上通过种类数和个数表示了 S t S_t St,通过维护cntwind、covered_num判断窗口是否覆盖了 S t S_t St
融合了哈希和动归的思想

class Solution {
public:string minWindow(string s, string t) {int slen = s.size(), tlen = t.size();string ans;if(slen < tlen) return ans;int ansleft = -1, ansright = slen;int cntwind[128] = {0};int covered_num = 0;for(char &c : t){if(cntwind[c] == 0){++covered_num;}--cntwind[c];}int left = 0;for(int right = 0; right < slen; ++right){++cntwind[s[right]];if(cntwind[s[right]] == 0) --covered_num;while(covered_num == 0){if(right - left < ansright - ansleft){ansleft = left;ansright = right;}--cntwind[s[left]];if(cntwind[s[left]] < 0) ++covered_num;++left;}   }return ansleft < 0 ? "" : s.substr(ansleft, ansright - ansleft + 1);}
};

总结,巧妙的通过数字的变化表示了窗口状态的变化
++cntwind[s[right]]; if(cntwind[s[right]] == 0) --covered_num;

http://www.lryc.cn/news/451468.html

相关文章:

  • python的内存管理机制
  • 阿布量化:基于 Python 的量化交易框架
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28
  • 【tower-boot 系列】开源RocketMQ和阿里云rockerMq 4.x和5.x集成 (一)
  • Pikachu-Cross-Site Scripting-反射型xss(post)
  • Vue3 工具函数(总结)
  • (undone) MIT6.824 Lab1
  • SpringMVC——REST
  • 【牛客网刷题记录】【java】二叉树
  • 一文讲透大语言模型构建流程
  • VR视频怎样进行加密和一机一码的使用?--加密(一)
  • Ubuntu启动后第一次需要很久才能启动GTK应用问题
  • 栏目二:Echart绘制动态折线图+柱状图
  • Gromacs——使用过程中暴露问题分析及学习
  • Webpack模式-Resolve-本地服务器
  • 【LLM论文日更】| 通过指令调整进行零样本稠密检索的无监督文本表示学习
  • 02.01、移除重复节点
  • 旅游推荐|旅游推荐系统|基于Springboot+VUE的旅游推荐系统设计与实现(源码+数据库+文档)
  • github项目--crawl4ai
  • 仅有N卡独显的情况下安装ubuntu是遇到的黑屏,加载卡顿等问题
  • Vite:为什么选 Vite
  • 个人项目简单https服务配置
  • Rust 函数
  • 微信小程序中的 `<block>` 元素:高效渲染与结构清晰的利器
  • 选读算法导论5.2 指示器随机变量
  • 大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
  • centos9 nginx 版本
  • https访问报错:net::ERR_CERT_DATE_INVALLD
  • cat用来查看文件内容、合并文件,或者将文件内容输出到终端
  • 基于ssm大学生自主学习网站的设计与实现