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

最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode)

Solution

这题思路不难,重点在于优化,如果采用常规做法的话,在判断窗口是否符合条件的时候,就是每次遍历长度为58的win数组来判断,这样做的话复杂度是O(58*m+n),但是实际上这样做是没有必要的,下面就是很重要的优化方法,这个方法适用于很多类似的判断窗口是否符合条件的情况。

维护一个变量less,代表窗口中子串字符的数量小于目标子串字符的个数,当less等于0的时候就说明满足条件。在滑动窗口的过程中维护less变量即可。

这里还获得一个启发就,就是不需要每次都用substr取出窗口字符串,只需要记录头和尾即可,到最后在取截取字符串。

class Solution {
public:// 复杂度(58*m+n)string minWindow1(string s, string t) {int n1 = s.length();int n2 = t.length();vector<int> cnt(58, 0);// unordered_map<char,int>cnt;int res_l = 0, res_r = n1;int flag = 0;for (char c : t)cnt[c - 'A']++;int l = 0;vector<int> win(58, 0);// unordered_map<char,int>win;for (int r = 0; r < n1; ++r) {char cur = s[r] - 'A';win[cur]++;while (check(win, cnt)) {flag = 1;// string temp=s.substr(l,r-l+1);if (r - l < res_r - res_l) {res_r = r;res_l = l;}win[s[l] - 'A']--;l++;}}string res = s.substr(res_l, res_r - res_l + 1);return (flag == 0) ? "" : res;}bool check(vector<int> a, vector<int> b) {for (int i = 0; i < a.size(); ++i) {if (a[i] < b[i])return false;}return true;}// 更优的做法,复杂度O(m+n)// 核心优化的点就在于如何判断当前窗口是否符合条件// 这里用一个变量less来记录窗口子串字符的数量小于目标子串字符的个数,当less等于0的时候就说明满足条件// 在滑动窗口的过程中维护less变量即可string minWindow(string s, string t) {int n1 = s.length();int n2 = s.length();vector<int> cnt(58, 0);int less = 0;for (char c : t) {if (cnt[c - 'A'] == 0)less++;cnt[c - 'A']++;}vector<int> win(58, 0);int l = 0, res_l = 0, res_r = n1, flag = 0;for (int r = 0; r < n1; ++r) {int cur = s[r] - 'A';if (++win[cur] == cnt[cur])less--;while (less == 0) {flag = 1;if (r - l < res_r - res_l) {res_l = l;res_r = r;}int index = s[l] - 'A';if (win[index] == cnt[index])less++;win[index]--;l++;}}string temp = s.substr(res_l, res_r - res_l + 1);return (flag == 1) ? temp : "";}
};

http://www.dtcms.com/a/465716.html

相关文章:

  • 算法4.0
  • 云网智安一体:中国电信数字安全创新的技术破局与生态构建
  • 制作音乐网站实验报告佛山做外贸网站渠道
  • 企业级数据库实操手册:从架构部署到安全运维的落地指南
  • 网络安全认证培训机构的痛点
  • 网站搜索引擎推广方案做网页设计的网站
  • 国内坚持做正品的网站女人学ui有前途吗
  • centos如何做的时间同步
  • CentOS 7 环境下 RabbitMQ 的部署与 Web 管理界面基本使用指南
  • 【AT指令解析】TencentOS Tiny AT指令解析源码分析1-简介
  • centos/cuos如何开启软件源
  • Java常见业务场景之批处理优化:从稳定性、性能、数据一致性、健壮性、可观测性五大维度,系统提供批处理优化方案
  • 网站建设拟采用的技术路线深圳互联网公司招聘
  • 人工智能学习:逻辑回归
  • 23种设计模式——命令模式(Command Pattern)
  • 网站空间用万网的 域名不在万网gta5 网站正在建设中
  • 枚举单例模式:Java单例实现的终极方案解析
  • 1.单例模式有哪几种常见的实现方式?
  • 安蓉建设总公司网站服装设计官网
  • PyTorch的安装与使用
  • 解决办法:win11连接蓝牙的时候每次连接都是100%的音量
  • foundry创建项目
  • 网站整体地图怎么做招设计师在哪里找
  • C#学习小笔记(完整版)—— Patience
  • 解决MySQL8.0及其更高版本的两个安全问题——及其配置MySQL实现SSL/TLS加密通信、caching_sha2_password通信
  • Node.js性能优化:从事件循环到内存管理
  • Node.js核心模块:fs、path与http详解
  • 企业级UDP文件传输工具如何重塑数据交换格局
  • 在JavaScript / Node.js中,Web服务器参数处理与编码指南
  • 佛山新网站建设服务网站中文域名好吗