leetcode 76. 最小覆盖子串

server/2025/3/4 17:37:08/

题目如下
在这里插入图片描述

数据范围
在这里插入图片描述

首先本题可以利用不定长的滑动窗口思想不断枚举右端同时检查窗口是否符合题意。
但是这样做每次新枚举一个窗口都要检查造成了很多重复计算。
我们发现其实每次变化要么是少一个字符要么是多一个字符而中间的根本没变。
所以,我们令字符串t出现的字符种类为m,
在枚举右端点的过程中每当窗口内的某个字符出现频率增加到与字符串t一样时count++。
在m == count时我们会发现此时答案可能出现在窗口内,
所以我们不断移动左端点同时减少对应的字符的频数当这个频数小于t中的频数时显然我们不能移动左端点了。
在这个过程中不断得到最小长度以及子串起始地址然后返回即可。

未优化通过代码

class Solution {
public:bool check() {for (auto& p : mapt) {if (maps[p.first] < p.second)return false;}return true;}unordered_map<char, int> mapt, maps;string minWindow(string s, string t) {int n = s.size();int m = t.size();if (m > n)return "";for (char c : t)mapt[c]++;int l = 0, r = 0;int ans = INT_MAX;int st = 0;while (r <= n) {if (mapt.count(s[r])) {maps[s[r]]++;}r++;while (l <= r && check()) {if (r - l < ans) {ans = r - l;st = l;}if (mapt.count(s[l])) {maps[s[l]]--;}l++;}}return ans == INT_MAX ? "" : s.substr(st, ans);}
};

在这里插入图片描述

优化后的通过代码

class Solution {
public:bool check() {for (auto& p : mapt) {if (maps[p.first] < p.second)return false;}return true;}unordered_map<char, int> mapt, maps;string minWindow(string s, string t) {int n = s.size();int m = t.size();if (m > n)return "";int count = 0;for (char c : t)mapt[c]++;m = mapt.size();int l = 0, r = 0;int ans = INT_MAX;int st = 0;while (r <= n) {if (mapt.count(s[r])) {maps[s[r]]++;// cout << maps[s[r]] << endl;if (maps[s[r]] == mapt[s[r]]) {count++;}while (l <= r && count == m) {//       cout << r << endl;if (r - l + 1 < ans) {ans = r - l + 1;st = l;}if (mapt.count(s[l])) {maps[s[l]]--;if (maps[s[l]] < mapt[s[l]]) {l++;count--;break;}}l++;}}r++;}//  cout << ans;return ans == INT_MAX ? "" : s.substr(st, ans);}
};

在这里插入图片描述


http://www.ppmy.cn/server/172388.html

相关文章

Linux:TCP和守护进程

一、TCP网络程序 1.1 TCP服务端 成员变量&#xff1a; int _listensock; // 监听的文件描述符 string _ip; // 服务端ip uint16_t _port; // 端口号 bool _isrunning; // 服务器是否在运行 1.1.1 InitServer-创建服务端 1、创建套接字socket socket()打开一个网络通讯端…

【软件测试】_selenium自动化测试:定位元素与点击元素

目录 1. CSS定位与XPath定位 1.1 以百度搜索栏和百度一下按钮了解元素定位 1.2 关于CSS和XPath位置的获取方法 2. 以输出百度热搜词条文本为例使用元素定位 2.1 使用开发者页面获取目标元素的CSS或XPath位置 2.2 使用selenium编写自动测试代码 2.3 查看自动测试结果 3. …

机器学习数学基础:35.效度

效度全攻略&#xff1a;从理论到实践的深度剖析 一、效度&#xff08;Validity&#xff09;入门&#xff1a;揭开精准测量的面纱 效度&#xff0c;简单来说&#xff0c;就是测量工具能否准确命中目标的“命中率”。想象你手中有一把枪&#xff08;测量工具&#xff09;&#…

C++ MySQL ORM接口设计优化:从宏污染到现代流式API

&#xff08;基于编译期反射与链式调用的ORM框架重构实践&#xff09; 在C中设计一个优雅的MySQL ORM接口&#xff0c;既要兼顾易用性&#xff0c;又要保障性能与类型安全。 本文针对开发者常见的宏污染、元数据冗余、API臃肿等问题&#xff0c;结合现代C特性提出一套优化方案…

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块&#xff1a; Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…

双指针刷题和总结

文章目录 双指针LeetCode反转字符串题目题解代码 删除有序数组中的重复项 II题目题解代码 除字符串中的所有相邻重复项题目题解代码 删除有序数组中的重复项题目题解代码 蓝桥杯拔河题解代码 双指针 1. 同向双指针:两个指针从同一侧开始&#xff0c;按照相同的方向移动。通常用…

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍&#xff1a;3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…

决策树(Decision Tree):机器学习中的经典算法

1. 什么是决策树&#xff1f; 决策树&#xff08;Decision Tree&#xff09;是一种基于树形结构的机器学习算法&#xff0c;适用于分类和回归任务。其核心思想是通过一系列的规则判断&#xff0c;将数据集不断划分&#xff0c;最终形成一棵树状结构&#xff0c;从而实现预测目…