76.最小覆盖子串

·题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

 

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
 

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。
示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

·解题思路:

1.需要字符类型和个数——考虑创建字典

创建两个字典,一个用于存放目标所需要的字母和个数;一个用来记录滑动窗口所涉及的字母和个数

2.需要记录窗口的起始——考虑滑动窗口

先滑动end,即窗口的右端,遍历记录字符。当满足所需要求的时候,再考虑滑动窗口的左端,缩短窗口长度,获取最小窗口

3.循环判断条件:

当滑动窗口包含目标窗口的时候,进入循环条件,移动左端指针。

·代码:

class Solution:
    def isContains(self,cur_str,target_str):
        for key in target_str:
            if cur_str[key] < target_str[key]:
                return False
        return True

    def minWindow(self, s: str, t: str) -> str:
        need = Counter(t)
        char_map = {}
        for key in need :
            if key not in char_map:
                char_map[key] = 0

        star = 0
        res = ""
        minlength = float('inf')
        for end in range(len(s)):
            if s[end] in need:
                char_map[s[end]] += 1
            end += 1
            while self.isContains(char_map,need):
                curlength = end - star + 1
                if curlength < minlength:
                    minlength = curlength
                    res = s[star: end+1]

                if s[star] in need:
                    char_map[s[star]] -= 1
                star -= 1
        return res

·代码优化

每次切片存储并且使用额外函数判断循环条件过于麻烦,考虑使用target_num对所需字符串个数进行计数。

    def minWindow(self, s: str, t: str) -> str:
        need ,windows = Counter(t),{}
        for key in need :
            if key not in windows:
                windows[key] = 0

        min_star ,min_end = 0,0
        min_length = float('inf')
        target_num = len(t)
        star = 0
        for end in range(len(s)):
            if s[end] in need:
                windows[s[end]] += 1
                if windows[s[end]] <= need[s[end]]:
                    target_num -= 1

            while target_num == 0:
                cur_length = end - star + 1
                if cur_length < min_length:
                    min_length = cur_length
                    min_star = star
                    min_end = end

                if s[star] in need:
                    windows[s[star]] -= 1
                    if windows[s[star]] < need[s[star]]:
                        target_num += 1

                star += 1

        if min_length == float('inf'):
            return ''
        return s[min_star : min_end+1]

————两个注意的点————

                if windows[s[end]] <= need[s[end]]:
                    target_num -= 1

这里表示,当滑动窗口中字符个数小于或等于所需要个数的时候,所需要的target_num 减一。这是因为该语句end] in need的条件下,也就是说,现在所放入的是s[end]一定是need中的字符,所以num可以减一。

若是改为windows[s[end]] >= need[s[end]],就会出现因为多余字符导致target_num 减为0 的情况。

                if s[star] in need:
                    windows[s[star]] -= 1
                    if windows[s[star]] < need[s[star]]:
                        target_num += 1

结束时候的判断条件就变为了,windows[s[star]] >= need[s[star]],这是因为,移动左窗口的时候,会导致所需要的元素滑出,从而影响所需要的target_num

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

64B/66B编码 自定义PHY层设计

一、前言 之前的一篇文章讲解了64B/66B的基本原理&#xff0c;本篇在基于64B/66B GT Transceiver的基础之上设计自定义PHY。基本框图如下。 二、GT Mdule GT Module就按照4个GT CHannel共享一个GT COMMON进行设置&#xff0c;如下图。要将例子工程中的GT COMMON取出&#xff…

3.4 海思SS928开发 - 烧写工具 - BurnTool Emmc 烧写

3.4 烧写工具 - BurnTool Emmc 烧写 BurnTool 工具提供了多种烧写方式&#xff0c;这里只介绍最常用的 烧写emmc方式。 环境准备 PC 与单板之间连接好调试串口以及网线。 将厂商提供的出厂镜像拷贝至 PC 硬盘上&#xff0c;解压后得到的文件如下&#xff1a; . ├── boot_…

解决Ubuntu安装NVIDIA显卡驱动导致的黑屏问题

前言 本文是在经历了3天内5次重装Ubuntu系统后写下的&#xff0c;根本原因就是这篇文章的主题——安装NVIDIA显卡驱动&#xff01;写下本文是为了让自己今后不再出同样类型的错误&#xff0c;同时&#xff0c;给其他出现同样问题的人一些启发&#xff01; 本文实例的电脑配置如…

WEB前端-笔记(二)

一、事件 1.1类型 focus 获取焦点事件 ipt.addEventListener("focus", () > {.log("") }) blue 失去焦点事件 ipt.addEventListener("blur", () > {console.log("") }) inout 文本输入事件 txt.addEventListener("i…

实在智能协办2024中国核能行业RPA数字员工专项培训会

2024年中国核能行业RPA数字员工专项培训会于4月16日-19日在杭州举办&#xff0c;由中国核能行业协会信息化专业委员会主办、实在智能承办。本次培训由理论讲解、技术深化和实际操作三部分组成&#xff0c;旨在帮助核能行业从业人员学习与掌握基于大模型的RPA技术应用&#xff0…

NVIDIA NCCL 源码学习(十四)- NVLink SHARP

背景 上节我们介绍了IB SHARP的工作原理&#xff0c;进一步的&#xff0c;英伟达在Hopper架构机器中引入了第三代NVSwitch&#xff0c;就像机间IB SHARP一样&#xff0c;机内可以通过NVSwitch执行NVLink SHARP&#xff0c;简称nvls&#xff0c;这节我们会介绍下NVLink SHARP如…

使用 Meta Llama 3 构建人工智能的未来

使用 Meta Llama 3 构建人工智能的未来 现在提供 8B 和 70B 预训练和指令调整版本,以支持广泛的应用 使用 Meta AI 体验 Llama 3 我们已将 Llama 3 集成到我们的智能助手 Meta AI 中,它扩展了人们完成工作、创造和与 Meta AI 联系的方式。通过使用 Meta AI 进行编码任务和解…

从零到一品牌电商私域流量代运营规划方案

【干货资料持续更新&#xff0c;以防走丢】 从零到一品牌电商私域流量代运营规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT共50页&#xff08;完整资料包含以下内容&#xff09; 目录 私域运营方案&#xff1a; 一、项目背景与目标 - 开创数智化…

华为路由器基于接口限速

一、背景 ISP与企业内网通过华为路由器接入Internet时,当大量流量进入路由器时,可能会因为带宽不足产生拥塞,导致丢包,严重影响用户上网体验。对于此需要对网络流量进行限制,其方式通常有防火墙带宽策略、路由器基于接口限速等。 二、华为路由器基于接口限速方式 在路由…

Docker 部署 MongoDB 数据库

文章目录 官网地址docker 网络mongod.conf部署 MongoDB部署 mongo-expressdocker-compose.ymlMongoDB shell 官网地址 https://www.mongodb.com/zh-cn docker 网络 # 创建 mongo_network 网络 docker network create mongo_network # 查看网络 docker network list # 容器连…

RT-Thread在Win10下编译出现 unsupported pickle protocol: 5解决方案

调试背景&#xff1a; 在WIN10下编译RT-Thread源码&#xff1a;对象处理器平台是Microchip SAMA5D27-SOM1-EK评估板。 unsupported pickle protocol: 5 编译出现报错:ValueError : unsupported pickle protocol: 5 $ scons scons: Reading SConscript files ... Newlib ver…

MySQL:执行一条查询语句期间发生了什么?

MySQL的架构分为两层&#xff0c;Server 层和存储引擎层 server层负责建立连接、分析和执行SQL&#xff0c;MySQL&#xff0c;MySQL大多数的核心功能模块都在在这里实现&#xff0c;下图上半部分都是server层做的事情&#xff0c;另外&#xff0c;所有的内置函数&#xff08;如…

在mini2440上编写linux应用程序、字符设备驱动程序的编写与编译

在mini2440上编写linux应用程序 结合前两篇的学习&#xff0c;一个linux操作系统已经在mini2440上运行起来了&#xff0c;结合交叉编译环境和nfs等工具&#xff0c;我们可以在mini2440上编写任何我们在linux系统编程中学到的应用程序。一个简要的多文件Makefile文件如下&#…

设计模式——2_9 模版方法(Template Method)

人们往往把任性也叫做自由&#xff0c;但是任性只是非理性的自由&#xff0c;人性的选择和自决都不是出于意志的理性&#xff0c;而是出于偶然的动机以及这种动机对感性外在世界的依赖 ——黑格尔 文章目录 定义图纸一个例子&#xff1a;从文件中获取信息分几步&#xff1f;Rea…

基于Spingboot+vue协同过滤音乐推荐管理系统

项目演示视频效果&#xff1a; 基于Spingbootvue协同过滤音乐推荐管理系统 基于Spingbootvue协同过滤音乐推荐管理系统 1、项目介绍 基于Springboot的音乐播放管理系统总共两个角色&#xff0c;用户和管理员。用户使用前端前台界面&#xff0c;管理员使用前端后台界面。 有推荐…

Golang内存、指针逃逸、垃圾回收机制概览

最近看到了一篇文章是关于go的内存、指针逃逸和垃圾回收机制的&#xff0c;发现自己并未很细致的了解过这方面的内容&#xff0c;于是在翻阅各种文章的情况下&#xff0c;写出了这篇总结&#xff0c;参考文章放在文末&#xff0c;可自取 内存 Go 语言使用一个自带的垃圾收集器…

【S32K3 入门系列】- ADC 模块简介(上)

一、 前言 对于 S32K3 系列的初学者来说&#xff0c;S32K3 系列的参考手册阅读难度是让人望而却步的&#xff0c;本系列将对 S32K3 系列的外设进行逐一介绍&#xff0c;对参考手册一些要点进行解析。本文旨在介绍 S32K3 系列的 ADC 模块&#xff0c; ADC&#xff08;Analog to…

node端导出excel-用请求排队来限流

需求 有一个会执行luckySheet脚本并且导出excel的node接口&#xff0c;会在每天凌晨执行&#xff0c;但是文件过大时会内存溢出 之前有用worker来实现多线程&#xff08;主要是避免变量污染&#xff09;&#xff0c;但这样只能保证主线程不卡死&#xff0c;几个子线程合起来占用…

MDC搭配ttl使用!!!

一、简介 MDC 介绍​ MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以被…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包&#xff0c;解压后即可使用 链接&#xff1a;https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码&#xff1a;c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下&#xff1a; ISAM.json 转 yolo.…