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

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 = 0indexs = []while r < len(s):c = s[r]if c in t_count:t_count[c] -= 1cnt += 1 if t_count[c] >= 0 else 0  # 每覆盖一个字符则加1indexs.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]] += 1r += 1return 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 = 0indexs = []ptr = -1while r < len(s):c = s[r]if c in t_count:t_count[c] -= 1cnt += 1 if t_count[c] >= 0 else 0  # 每覆盖一个字符则加1indexs.append(r)while cnt == n:ptr += 1l = 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]] += 1r += 1return 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 indiceswhile (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.mzph.cn/news/861009.shtml

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

相关文章

格式化输出软件

一个给图片修改名字的小软件 功能&#xff1a; 输入文件名字&#xff0c;生成一个”当前时间文件名“的格式化内容到剪贴板方便改名 主界面有个复选框&#xff0c;勾选后会生成”文件名当前时间“的内容 演示&#xff1a; 输入无效字符时 代码&#xff1a; import sys from…

ctr/cvr预估之DeepFM模型

ctr/cvr预估之DeepFM模型 在数字营销的浪潮中&#xff0c;点击率&#xff08;CTR&#xff09;和转化率&#xff08;CVR&#xff09;预估已成为精准广告投放和个性化推荐系统的核心。随着深度学习技术的蓬勃发展&#xff0c;传统的机器学习方法&#xff0c;如逻辑回归和因子分解…

【Python】Python异常处理及常见错误详解

Python是一种动态类型的高级编程语言&#xff0c;其简单易懂的语法和强大的功能使其成为当今最流行的编程语言之一。然而&#xff0c;在编写Python代码时&#xff0c;我们难免会遇到各种错误。理解和处理这些错误是每个Python开发者必备的技能。本文将深入探讨Python中的异常处…

会声会影2024破解版本激活码注册机免费安装包下载

今天我要来和大家安利一款让我彻底改变对视频创作认知的神器 —— 会声会影2024&#xff01;✨&#x1f389; 会声会影全版本绿色安装包获取链接&#xff1a;&#xff08;抓紧保存以防失效&#xff09; https://pan.quark.cn/s/06e2f90a8526 会声会影最新一键安装包下载如下…

数据分析必备:12个“地表超强”数据可视化工具推荐!

数据可视化之所以流行&#xff0c;不仅是因为它简化了我们查看复杂数据的方式&#xff0c;更是因为数据可视化可以加快我们获取数据信息的速度。但对于初学者来说&#xff0c;使用数据可视化工具并不能快速启动。因此&#xff0c;本文专门为您列出了12个免费的数据可视化工具&a…

期货交易什么是锁仓,锁仓有什么利弊

锁仓是期货交易中的一种操作&#xff0c;指的是投资者在持有合约头寸的同时&#xff0c;通过建立相反的合约头寸来对冲风险&#xff0c;以保护自己的投资。锁仓可以通过买入或卖出相同数量的相同合约来实现&#xff0c;使投资者的净头寸为零。 此时无论行情上涨或者下跌&#…

互联网医院系统开发中的移动端应用设计

在现代医疗服务中&#xff0c;互联网医院系统逐渐成为提升患者体验和优化医疗资源的重要手段。而移动端应用作为互联网医院系统的关键组成部分&#xff0c;其设计和开发尤为重要。本文将从设计原则、技术架构和具体实现等方面探讨互联网医院系统中的移动端应用设计&#xff0c;…

Apple - View Programming Guide

本文翻译整理自&#xff1a;View Programming Guide&#xff08;更新&#xff1a;2013-08-08 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaViewsGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002978-CH1-SW1 文章目录…

threejs tween补间动画(七)

1.引入依赖 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js//引入相机轨道控制器 import { GLTFLoader } from three/examples/jsm/loaders/GLTFLoader.js//引入GLTF模型加载器 import { DRACOLoader } from thre…

汽车零部件制造企业如何选择合适的ESOP电子作业指导书系统

随着汽车产业的不断发展&#xff0c;汽车零部件制造企业在提高生产效率和产品质量方面面临着越来越大的挑战。为了解决这些问题&#xff0c;越来越多的汽车零部件制造企业开始采用ESOP电子作业指导书系统&#xff0c;以帮助他们管理和优化生产流程。但是&#xff0c;在选择合适…

【ppt技巧】有哪些方法可以实现?PPT转换为图片!

将ppt文件转换为图片都有哪些方法可以实现&#xff1f;其实很简单&#xff0c;一起来看一下如何操作吧&#xff01; 方法一&#xff1a; 使用格式转换器&#xff0c;有些文件格式转换器&#xff0c;支持ppt转换为图片。 方法二&#xff1a; 不需要转换器&#xff0c;直接在…

Pixel手机中文网-全球最大的华人Pixel手机论坛

Pixel手机中文网&#xff0c;使用Pixel手机华人的聚集地&#xff0c;快来加入这个大家庭分享和创作吧 &#x1f603; googlepixel.cn

STM32之三:中断外部中断

目录 1. 什么是中断 1.1 中断概念 1.2 中断优先级 1.3 中断嵌套 2.STM32中断 2.1 NVIC中断优先级 3 外部中断 3.1 EXTI简介 3.2 EXTI中断/事件线 3.3 EXTI功能框图 3.4 中断和事件的区别&#xff1f; 3.5 什么时候用外部中断&#xff1f; 3.怎么使用STM32中断 3.…

stm32F4库函数c++和C混合编程笔记20240626

1、有时候需要用到c的一些特性&#xff0c;封装&#xff0c;类等等。 2、研究一下如何更改之前c工程的内容&#xff0c;实现混合编程。 操作 1、keil设置 2、要重新建立一个main文件&#xff0c;后缀名是cpp&#xff0c;cpp才能调用cpp. 后面如果要用到c特性的&#xff0c;需要…

msvcr100.dll丢失的解决方法,学会这几种方法都能快速解决dll丢失

一、 msvcr100.dll丢失原因分析 系统文件损坏 系统文件损坏是导致msvcr100.dll丢失的常见原因之一。这种情况可能由多种因素引起&#xff0c;包括但不限于&#xff1a; 磁盘错误&#xff1a;磁盘的物理损坏或逻辑错误可能导致系统文件损坏。 病毒或恶意软件攻击&#xff1a…

【探索Linux】P.35(传输层 —— UDP协议)

阅读导航 引言一、UDP协议端格式二、UDP的特点三、UDP的缓冲区四、基于UDP的应用层协议温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了网络协议的应用层&#xff0c;揭示了各种协议如何协同工作以确保信息在网络中正确、高效地传递。从HTTP到FTP&#xff0c;每一层协…

6.二叉树.题目2

6.二叉树.题目2 题目9.找树左下角的值10.路径总和11.从中序与后序遍历序列构造二叉树12.最大二叉树13.合并二叉树14.二叉搜索树中的搜索15.验证二叉搜索树16.二叉搜索树的最小绝对差 总结 题目 9.找树左下角的值 题目链接 给定一个二叉树&#xff0c;在树的最后一行找到最左边…

【LeetCode】二、链表相关:移除与反转链表

文章目录 1、链表结构2、leetcode203&#xff1a;移除链表元素3、leetcode206&#xff1a;反转链表 1、链表结构 和数组不同&#xff0c;此时不需要连续的内存空间&#xff0c;如下为单端链表&#xff0c;无pre指针 时间复杂度&#xff1a; 和数组相反&#xff0c;访问元素时…

Jackson和fastjson解决序列化时字段属性大小写改变的问题

在部分特殊场景下&#xff0c;我们可能会把实体的字段属性改成全部大写&#xff0c;但是在返回前端时&#xff0c;字段会被序列化成小写。 比如我们有一个这个类属性都是大写&#xff1a; 后端接口是这样的 然后我们请求后&#xff0c;会发现我们的字段被变成全部小写的。 …