76. 最小覆盖子串(困难)

news2024/11/17 23:43:44

76. 最小覆盖子串

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
    • 3.2 Java

1. 题目描述

题目中转:76. 最小覆盖子串
在这里插入图片描述
在这里插入图片描述

2.详细题解

    在s中寻找一个最短的子串,使之包含t中的所有字符,t中可能存在多个相同字符,寻找的子串也应至少含有相同数量的相同字符(示例3可以进一步确认)。子串即连续的一段子字符串区间,可以进一步总结为寻找一个区间,该区间内的字符包含t中的所有字符,即双指针,左指针指向子串的起始索引,右指针指向子串的结束索引,初始时,左右指针均指向s起始索引,两个指针均从左至右移动。
  step1:右指针开始移动,直至包含了t中的所有字符【需要注意的视,t中的单一字符可能会出现多次,因此首先需要统计各字符出现的次数】;
  step2:左指针开始移动,移除左端所有非t中出现的字符,计算此时寻找的子串长度并与已知子串长度对比,若更小则更新子串长度和记录左右位置;
  step3:左指针指向的字符为t中存在的字符,移除该字符,则此时子串不再包含t中所有字符,重复步骤step1——step3。

3.代码实现

3.1 Python

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        t_count = Counter(t)
        l, r, n = 0, 0, len(t)
        res = [0, -1, len(s)+1]
        cnt = 0
        indexs = []
        while r < len(s):
            c = s[r]
            if c in t_count:
                t_count[c] -= 1
                cnt += 1 if t_count[c] >= 0 else 0  # 每覆盖一个字符则加1
                indexs.append(r)
            while cnt == n and len(indexs) > 0:
                l = indexs.pop(0)
                if r - l + 1 < res[-1]:
                    res = [l, r, r-l+1]
                cnt -= 1 if t_count[s[l]] >= 0 else 0  # 减少一个覆盖字符
                t_count[s[l]] += 1
            r += 1
                
        return s[res[0]: res[1]+1]

在这里插入图片描述
  为缩短左指针遍历的次数,使用了一个列表存储包含t符号的索引,但这样忽略了一个问题,列表的插入和删除的时间,尽管末尾插入时间复杂度为常数,但队首删除时间复杂度为O(N),为进一步优化,不再使用删除,直接记录下所有的位置,牺牲空间换取时间:

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        t_count = Counter(t)
        l, r, n = 0, 0, len(t)
        res = [0, -1, len(s)+1]
        cnt = 0
        indexs = []
        ptr = -1
        while r < len(s):
            c = s[r]
            if c in t_count:
                t_count[c] -= 1
                cnt += 1 if t_count[c] >= 0 else 0  # 每覆盖一个字符则加1
                indexs.append(r)
            while cnt == n:
                ptr += 1
                l = indexs[ptr]
                if r - l + 1 < res[-1]:
                    res = [l, r, r-l+1]
                cnt -= 1 if t_count[s[l]] >= 0 else 0  # 减少一个覆盖字符
                t_count[s[l]] += 1
            r += 1
                
        return s[res[0]: res[1]+1]

在这里插入图片描述

3.2 Java

class Solution {
    public String minWindow(String s, String t) {
        Map<Character, Integer> t_count = new HashMap<>();
        for (char c : t.toCharArray()) {
            t_count.put(c, t_count.getOrDefault(c, 0) + 1);
        }
        
        int l = 0, r = 0, n = t.length();
        int[] res = {0, -1, s.length() + 1};
        int cnt = 0;
        int head = 0;
        int ptr = -1;
        int[] indexs = new int[s.length()]; // use an array to store indices
        
        while (r < s.length()) {
            char c = s.charAt(r);
            if (t_count.containsKey(c)) {
                t_count.put(c, t_count.get(c) - 1);
                if (t_count.get(c) >= 0)cnt++;
                indexs[head++] = r; // store the index
            
            }
            while (cnt == n) {
                ptr++;
                l = indexs[ptr];
                if (r - l + 1 < res[2]) {
                    res[0] = l;
                    res[1] = r;
                    res[2] = r - l + 1;
                }
                t_count.put(s.charAt(l), t_count.get(s.charAt(l)) + 1);
                if (t_count.get(s.charAt(l)) > 0) cnt--;
            }
            r++;
        }
        
        return res[1] == -1 ? "" : s.substring(res[0], res[1] + 1);
    }
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

富豪王思聪的“爱情喜剧”从万达排片到网红聊天

王思聪&#xff0c;这位人生如戏、戏如人生的富二代&#xff0c; 在爱情的战场上可谓是屡战屡败&#xff0c;屡败屡战。 想当年&#xff0c;他向戚薇发起了猛烈的爱情攻势&#xff0c; 豪言壮语道&#xff1a;“若我以万达25%的排片量换你一笑&#xff0c;你可愿与我共舞&am…

计算机网络之数据通信原理

1.通信系统的基本组成 信源&#xff1a;信息的发出者&#xff1b; 信宿&#xff1a;信息的接收者&#xff1b; 载体&#xff1a;信息的传送通道&#xff1b; 变换器&#xff1a;将信息变换成载体上可传输的信号&#xff1b; 反变换器&#xff1a;将载体上传输的信号变换成信…

mysql GROUP_CONCAT分组连接

文章目录 GROUP_CONCAT 分组连接GROUP_CANCAT 的使用分班级列出名单分班级列出名单并包含显示性别组合IFNULL组合IF组合case when GROUP_CONCAT 分组连接 准备的数据示例 CREATE TABLE students (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,classNa…

如何快速交付网络基础设施运维管理软件项目?

​ 基于nVisual网络基础设施数字孪生管理工具 开发项目需求 项目交付成本节省50%、进度提高100% ​ &#xff1e;&#xff1e;&#xff1e;nVisual主要功能&#xff1c;&#xff1c;&#xff1c; 01 场 景 ★ 支持层次化的场景结构 ★ 支持多种空间场景 ​ 02 规 划 ★ 丰…

SpringBoot集成IotDB

1、引入依赖 <dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>0.14.0-preview1</version></dependency><dependency><groupId>cn.hutool</groupId><a…

66Uptime – 网站服务器 Cronjob 监控工具 v35.0.0扩展中文版安装

66Uptime是一款自托管、易于使用、轻量级且高性能的网站服务器和Cronjob监控工具。以其丰富的功能和便捷的管理方式&#xff0c;为用户提供了全方位的网站服务器和Cronjob监控解决方案&#xff1a; 主要功能&#xff1a; 监控网站服务器和Cronjob的运行状态&#xff0c;确保它们…

登录界面设计精粹:跟随行业巨头的UI创新

在设计登录界面UI时&#xff0c;必须从用户的角度来考虑。精心设计的登录界面UI是网站用户体验过程的关键。登录UI有助于吸引访问者到网站&#xff0c;并将其转化为核心客户。因此&#xff0c;拥有友好的门户非常重要。接下来我就详细向大家介绍一下如何设计登录页面。 1、使用…

【云原生】加强理解Pod资源控制器

Pod控制器 文章目录 Pod控制器一、Replication Controller&#xff08;RC&#xff09;1.1、什么是RC1.2、RC应用1.3、RC滚动更新 二、Replication Set&#xff08;RS&#xff09;2.1、什么是RS2.2、RS应用 三、Deployment3.1、什么是Deployment3.2、更新节奏和更新逻辑3.3、自定…

论文阅读KVQ: Kwai Video Quality Assessment for Short-form Videos

背景 短视频格式、内容与长视频不同&#xff0c;需要引入新的质量评估方法。作者构建了一个新的用于质量评估的数据集&#xff0c;提出了新的质量评估方法。 如下图所示&#xff0c;短视频有不同的格式、有模糊、噪声、编码等各种畸变。 KVQ 数据集 通过快手平台选择多样化…

记一次VMware vCenter渗透过程(主要是踩坑分享)

针对VMware vCenter的介绍就不多说了&#xff0c;大佬们可以自己搜搜。这里只分享过程和踩到的坑点&技巧。 1 坑点&技巧总结 总体流程分为三大步&#xff1a;拿wenshell-->获取登录Cookie-->获取域控账密/hash(有域控的情况下) 相应的坑点&技巧也分别在不…

Robust semi-supervised segmentationwith timestep ensembling diffusion models

时间步合成扩散模型的鲁棒半监督分割 摘要 医学图像分割是一项具有挑战性的任务&#xff0c;由于许多数据集的大小和注释的限制&#xff0c;使得分割更加困难。消噪扩散概率模型(DDPM)最近在模拟自然图像的分布方面显示出前景&#xff0c;并成功地应用于各种医学成像任务。这…

LangChain之Agent代理

OpenAI Functions Agent 概述 某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经过微调,可以检测何时应该调用特定的函数,并应该将该函数的正确输入进行响应。在API调用中&#xff0c;您可以描述想要调用的函数&#xff0c;然后让模型智能地选择输出包含调用这些函数所需…

使用 MediaPipe 实现实时手部追踪和手势识别 | Rerun展示

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在本文中&#xff0c;我将展示一个使用 MediaPipe Python 和 Rerun SDK 进行手部追踪和手势识别的示例。如果您有兴趣深入了解并扩展您的知识&#xff0c;我将指导您如何安装 MediaPipe Python 和 Rerun SDK 来进行手部追…

web前端课程大作业-高校学生事务中心

文章目录 概述代码页面截图代码链接 概述 仿制高校的学生事务中心&#xff0c;一个登录和注册页面 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conten…

计算机毕业设计Thinkphp/Laravel智能道路交通管理系统4ir8r

Laravel非常的简洁并且是开源的&#xff0c;Laravel 是一个具有表现力、优雅语法的 Web 应用程序框架. Laravel 是构建现代全栈 Web 应用程序的最佳选择. 它的语法更富有表现力&#xff0c;拥有高质量的文档和丰富的扩展包&#xff0c;技术上它有Bundle扩展包、Eloquent ORM、反…

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源&#xff1a; https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总&#xff1a; 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

【AIGC】《AI-Generated Content (AIGC): A Survey》

文章目录 相关概念What is AI-generated content?Necessary conditions of AIGCHow can AI make the content better?The industrial chain of AIGCAdvantages of large-scale pre-trained modelsGeneration of smart textPros of AIGCCons of AIGCAIGC and Metaverse 挑战潜…

第 11 课:组件介绍与自定义开发

本讲主要介绍了隐语的组件标准、已有的组件能力以及进一步的自定义开发流程。经过本讲的学习&#xff0c;可以为将隐语集成到任意调度系统&#xff0c;基于Kusica/SecretPad进行二次开发&#xff0c;以及参与隐语开放标准共建建立基础。 一、隐语开放标准 隐语提出的适用于隐私…

Sora:探索AI视频模型的无限可能

随着人工智能技术的飞速发展&#xff0c;AI在视频处理和生成领域的应用正变得越来越广泛。Sora&#xff0c;作为新一代AI视频模型&#xff0c;展示了前所未有的潜力和创新能力。本文将深入探讨Sora的功能、应用场景以及它所带来的革命性变化。 一、Sora的核心功能 1.1 视频生…