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

76. 最小覆盖子串

题目链接:力扣

解题思路:滑动窗口

  1. 因为只需要最小子串中包含t中的所有字符即可,顺序不重要,所以可以先统计一下 t 中每个字符出现的次数,使用map进行统计:
    1. key表示t中的字符,
    2. value表示字符的个数:值为正数时表示滑动窗口中需要value个字符,值为负数时表示滑动窗口中多余了 -value个字符
  2. 初始值:
    1. result = "":保存最小子串
    2. num = 0:窗口中包含的 t 中的有效字符个数(如果t中字符a有两个,滑动窗口中已经有两个a了,这个时候右遇到一个a,num并不加1,因为这个a是无效的)
    3. left = 0:滑动窗口的左边界
    4. right = 0:滑动窗口的右边界
  3. 不断左移滑动窗口的右边界,当num==t.length,找到了一个字串包含所有t中的字符,但是这个时候,滑动窗口的左边界可能会有一些无效的字符或者多余的字符
    1. 比如 BABC子串,包含t = BC,但是前面的BA是无效的,可以删去,最小子串为BC
  4. 具体移动过程如下,如果right < s.length,则一直往右移动:
    1. 如果 map.containsKey(s.charAt(right)):当前字符是 t 中的字符
      1. 如果map.get(s.charAt(right)) > 0:说明滑动窗口中包含当前字符的个数小于t中的字符个数,令 num++
      2. map.put(s.charAt(right),map.get(s.charAt(right))-1):令当前字符个数 -1,方便后面缩小滑动窗口的左边界
    2. 如果 num == t.length:说明滑动窗口中已经包含了所有t中的字符,但这个时候左边界可能有一些不在t中的字符或者多余的字符。需要循环缩小左边界:
      1. 如果 左边界的字符不在 t中,或者 map.get(s.charAt(left)) < 0,即字符有多余,这两种情况下都需要收缩:
        1. 如果在t中,并且map中的值小于0,说明左边界这个字符是多余的,令map中的值+1
        2. left++
    3. 如果result.equal("")或者 right - left +1 < result.length():更短的子串
      1. 令result = s.substring(left,right+1)

AC代码:
 

class Solution {public static String minWindow(String s, String t) {char[] sStr = s.toCharArray();char[] tStr = t.toCharArray();Map<Character, Integer> map = new HashMap<>();for (char c : tStr) {map.put(c, map.getOrDefault(c, 0) + 1);}int left = 0;String result = "";//记录滑动窗口中包含多少个t中的字符int num = 0;for (int right = 0; right < sStr.length; right++) {if (map.containsKey(sStr[right])) {if (map.get(sStr[right]) > 0) {num++;}map.put(sStr[right], map.get(sStr[right]) - 1);}if (num == tStr.length) {//缩小窗口右边界while (!map.containsKey(sStr[left]) || map.get(sStr[left]) < 0) {if (map.containsKey(sStr[left])) {map.put(sStr[left], map.get(sStr[left]) + 1);}left++;}if (result.equals("") || right - left + 1 < result.length()) {result = s.substring(left, right + 1);}}}return result;}
}

使用集合进行统计滑动窗口中需要的字符个数或者多余的字符个数,效率较低,可以使用hash表进行优化,思路类似,只不过将map换成hash表:

AC代码

class Solution {public static String minWindow(String s, String t) {char[] sStr = s.toCharArray();char[] tStr = t.toCharArray();int[] hash = new int[128];for (char c : tStr) {hash[c]++;}int left = 0;String result = "";//记录滑动窗口中包含多少个t中的字符int num = 0;for (int right = 0; right < sStr.length; right++) {hash[sStr[right]]--;if (hash[sStr[right]] >= 0) {num++;}while (num == tStr.length && hash[sStr[left]] < 0) {hash[sStr[left++]]++;}if (num == tStr.length && (result.equals("") || right - left + 1 < result.length())) {result = s.substring(left, right + 1);}}return result;}
}

 

相关文章:

76. 最小覆盖子串

题目链接&#xff1a;力扣 解题思路&#xff1a;滑动窗口 因为只需要最小子串中包含t中的所有字符即可&#xff0c;顺序不重要&#xff0c;所以可以先统计一下 t 中每个字符出现的次数&#xff0c;使用map进行统计&#xff1a; key表示t中的字符&#xff0c;value表示字符的个…...

科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛

一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...

第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 类激活映射&#xff08;Class Activation Mapping&#xff0c;CAM&#xff09;和梯度权重类激活映射&#xff08;Gradient-weighted Class Activation Mapping&#xff0c;Grad-CAM&#xff09;是两种可视化深度学习模型决策过程的技术…...

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步&#xff0c;但风电、光伏发电间歌性、波动性强&#xff0c;电网消纳压力较大&#xff0c;且电…...

java文件

一.File类 二.扫描指定目录&#xff0c;并找到名称中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;&#xff0c;并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…...

pyqt5 如何终止正在执行的线程?

在 PyQt5 中终止正在执行的线程&#xff0c;可以通过一些协调的方法来实现。一般情况下&#xff0c;直接强行终止线程是不安全的&#xff0c;可能会导致资源泄漏或者程序异常。相反&#xff0c;我们可以使用一种协作的方式&#xff0c;通知线程在合适的时候自行退出。 以下是一…...

力扣第357场周赛补题

6925. 故障键盘 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;模拟 class Solution { public:string finalString(string s) {string res;for(auto c : s){if(c i) reverse(res.begin(), res.end());else res c;}return res;} }; 6953. 判断是否能拆分数组 - 力…...

Keras指定model.fit()的输出

model.fit()当verbose1的时候会打印出所有指标和loss, 在多输出的情况下更是一团乱麻. 下面是一个可以指定每个epoch训练完的输入指标的方法: from keras.callbacks import Callback# Custom callback to display loss only at the end of each epoch class LossCallback(Call…...

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 某高科技企业成立于2015年&#xff0c;是一家深耕于大物流领域的人工智能公司&#xff0c;迄今为止已为全球16个国家和地区&#xff0c;120余家客户打造智能化升级体验&#xff0c;场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…...

解决log4j.xml的url没有注册问题

在对log4j.xml配置文件配置时出现http//jakarta.apache.org/log4j/爆红&#xff0c;IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…...

深度思考操作系统面经

1 堆和栈的区别&#xff1a;&#xff08;如果记的不太清楚&#xff0c;可以类比jvm中的堆和栈的区别&#xff0c;大差不差&#xff09; 存储位置&#xff1a;堆是在计算机内存中动态分配的区域&#xff0c;而栈是在计算机内存中由操作系统自动分配和管理的区域。管理方式&…...

智慧工地源码:数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段&#xff0c;进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加&#xff0c;施工现场管理的内容越来越多&#xff0c;管理的技术难度和要求在不断提高。传统的施工现场管理模…...

解决rockchip平台Android13系统以太网设置静态IP保存不了问题

前言 rk平台平Android13系统测试以太网,发现设置静态IP保存不了问题,即设置静态IP以后重启系统,IP又变成动态的了。 分析 抓取log发现保存静态IP的时候会打印如下log: 08-07 06:22:28.377 626 749 D EthernetNetworkFactory: updateInterface, iface: eth0, ipConfi…...

SQLAlchemy与标准SQL相比有哪些优点?

让我来给你讲讲SQLAlchemy和标准SQL相比有哪些优点吧&#xff01; 首先&#xff0c;我们要知道&#xff0c;SQLAlchemy是一个Python的SQL工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;它把Python的面向对象编程&#xff08;OOP&#xff09;的理念带入了数…...

Zookeeper与Kafka

Zookeeper与Kafka 一、Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制 二、部署 Zookeeper 集群1.准备 3 台服务器做 Zookeeper 集群2.安装 Zookeeper3.拷贝配置好的 Zookeeper 配置文件到…...

MySQL—— 基础语法大全

MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…...

css小练习:案例6.炫彩加载

一.效果浏览图 二.实现思路 html部分 HTML 写了一个加载动画效果&#xff0c;使用了一个包含多个 <span> 元素的 <div> 元素&#xff0c;并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画&#xff0c;由20个垂直排列的…...

使用正则表达式替换文本中的html标签

文章目录 使用正则表达式替换文本中的html标签原文本&#xff1a;使用正则表达式进行替换替换后&#xff1a;展示 html 文本 使用正则表达式替换文本中的html标签 我们存储 markdown 文章时&#xff0c;如果存储转换后的 html 页面&#xff0c;那么在查出来的时候&#xff0c;…...

当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢

解决办法&#xff1a; 答案来源&#xff1a;...

【go-zero】docker镜像直接部署go-zero的API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...