【Leetcode-Hot100】最小覆盖子串

题目

解答

想到使用双指针+哈希表来实现,双指针的left和right控制实现可满足字符串。

class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t = len(s), len(t)hash_map = {}for i in range(len_t):if t[i] in hash_map:hash_map[t[i]] += 1else:hash_map.setdefault(t[i], 1)copy_hash = deepcopy(hash_map)min_len = 1e5min_left = 0tag = False # 记录是否已经找到满足条件子串for left in range(len_s):if s[left] not in hash_map:continueright = leftwhile len(copy_hash) != 0 and right < len_s:if s[right] in copy_hash:if copy_hash[s[right]] > 1:copy_hash[s[right]] -= 1elif copy_hash[s[right]] == 1:copy_hash.pop(s[right])right += 1if len(copy_hash) != 0: #代表right >= len_sbreakelse: # 代表找到一个合法块满足要求tag = Truecurrent_len = right - leftif current_len < min_len:min_len = current_lenmin_left = leftcopy_hash = deepcopy(hash_map)if tag == True:return s[int(min_left):int(min_left+min_len)]else:return ""

报错:

仔细看了代码,发现我使用的双指针会造成平方复杂度,每次左指针移动后,都重新从当前的left位置开始扩展右指针,这样会有大量的重复计算。所以,需要重新设计算法,使用更高效的滑动窗口方法。可能的改进方向是:维护一个滑动窗口,用两个指针left和right。先扩展right直到窗口包含所有t的字符,然后尝试移动left缩小窗口,同时更新最小窗口的长度。这样每个元素最多被访问两次(left和right各一次),时间复杂度为O(n)。另外,原来的代码中使用了deepcopy来恢复copy_hash,这可能也很耗时。因为每次循环都要复制整个哈希表,当哈希表较大时,这会增加时间消耗。应该维护一个当前的计数器,动态地增减字符出现的次数,而不是每次都复制哈希表。

修改后的代码如下:

class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""# 构造哈希表-tmap_t = defaultdict(int)for st in t:map_t[st] += 1# 需要符合条件的字符数require_len = len(map_t)current_window = defaultdict(int)try_len = 0left = 0min_len = 1e5min_left = 0tag = Falsefor right in range(len(s)):current_window[s[right]] += 1if s[right] in map_t and current_window[s[right]] == map_t[s[right]]:try_len += 1while try_len == require_len and left <= right:tag = Truecurrent_len = right - left + 1if current_len < min_len:min_len = current_lenmin_left = leftcurrent_window[s[left]] -= 1if s[left] in map_t and current_window[s[left]] < map_t[s[left]]:try_len -= 1left += 1if tag == True:return s[min_left: min_left + min_len]else:return ""

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

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

相关文章

Flutter 播放利器:`media_kit` 的详细介绍与使用指南

在 Flutter 项目中实现音视频播放&#xff0c;开发者过去主要依赖如 video_player、just_audio 等第三方库&#xff0c;但这些库或多或少存在一些局限性&#xff0c;比如平台兼容性差、定制能力不足、播放格式有限等问题。 而 media_kit 是近年崛起的一款全平台音视频播放解决…

4.14【Q】pc homework3

我正在学习并行计算&#xff0c;解决这个问题&#xff1f;详细解释&#xff0c;越细节越好 我正在学习并行计算&#xff0c;“首次允许在 taskloop 构造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 构造&#xff09;和 in_reduction&…

ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在 Java 开发中&#xff0c;集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景&#xff0c;盲目使用可能导致内存浪费、性能…

大模型训练显存压缩实战:ZeRO-3 vs 梯度累积 vs 量化混合策略

一、显存瓶颈的本质与挑战 大模型训练面临的核心矛盾是模型参数量指数级增长与GPU显存容量线性提升之间的鸿沟。以175B参数模型为例&#xff0c;其显存消耗主要来自三个方面&#xff1a; 参数存储‌&#xff1a;FP32精度下需700GB显存‌梯度缓存‌&#xff1a;反向传播产生的…

边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“

在数据成为核心生产要素的今天&#xff0c;边缘计算与隐私计算的交汇正在重塑技术生态。这并非简单的技术叠加&#xff0c;而是一场关于数据主权、算力分配与信任机制的深度博弈。本文将从"数据流动的拓扑学"视角&#xff0c;探讨二者融合如何重构数字社会的基础设施…

Obsidian 文件夹体系构建 -INKA

Obsidian 文件夹体系构建 -INKA 本篇文章主要分享一下自己折腾学习实践过的 INKA 框架方法。原地址&#xff1a;Obsidian文件夹体系构建–INKA。 文章目录 Obsidian 文件夹体系构建 -INKA前言INKA简介INKA 理论最佳实践实际应用 反思 前言 上文 Obsidian文件夹体系构建-ACCES…

ocr-不动产权识别

目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验&#xff1a;房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…

LeetCode算法题(Go语言实现)_47

题目 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 ‘.’ 表示&#xff09;和墙&#xff08;用 ‘’ 表示&#xff09;。同时给你迷宫的入口 entrance &#xff0c;用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除无效的干扰!巧妙转化

文章目录 The Strict Teacher (Hard Version) 思考问题&#xff01;那么多个人抓一个人&#xff0c;是否是每一个人都是对于最优策略的答案是有贡献的&#xff1f;答案是否定的&#xff0c;其实问题可以简化为三种情况&#xff1a; 所有的老师都在大卫的右边&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文阅读

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的强化学习&#xff1a;机遇与挑战 摘要 本综述文章源自作者在 Educational Data Mining (EDM) 2021 会议期间组织的 RL4ED 研讨会。我们组织了这一研讨会&#xff0c;作为一项社区建设工作的组…

idea的快捷键使用以及相关设置

文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接&#xff1a;力扣452.用最少数量的箭引爆气球 视频链接&#xff1a;代码随想录 题…

Swift —— delegate 设计模式

一、什么是 delegate 模式 所谓 delegate 就是代理模式。简单来说&#xff0c;delegate 模式就是在类的函数里运行完一段代码后&#xff0c;你可以通过一个符合某个代理协议的属性来调代理的方法。其中&#xff0c;代理方法就是回调函数。 二、delegate 模式与闭包比的优势 …

linux-vi和文件操作

在 Linux 系统的世界里&#xff0c;有一个核心思想贯穿始终&#xff0c;那就是 “万物都是文件”。这一理念极大地简化了系统资源的管理和操作&#xff0c;为用户和开发者提供了统一且高效的交互方式。本文将深入探讨这一理念在 Linux 文件系统中的具体体现&#xff0c;从硬盘分…

Endnote 21显示字段设置与修改详细解析(附Endnote Click)

目录 前言字段设置与详细解释Endnote Click1. 安装 Endnote Click2. 一键获取Edge插件3. 安装完成启动插件4. 检索期刊文献案例5. 在 Endnote Click 我的locker中导入文献 前言 在学术研究的漫漫征途中&#xff0c;高效管理参考文献是每位学者、学生都绕不开的关键环节。Endno…

java使用 ​Stream 流对自定义对象数组去重的

在 Java 中&#xff0c;使用 Stream 流对自定义对象数组去重的核心是确保对象能正确判断“重复”的逻辑。以下是具体实现方法及场景分析&#xff1a; 方法 1&#xff1a;直接使用 distinct()&#xff08;需重写 equals 和 hashCode&#xff09; 若自定义对象已正确重写 equals…

C++ (类的设计,对象的创建,this指针,构造函数)

类的设计 C对结构体是有增强的 可以包含函数作为结构体成员 可以直接定义变量 在结构体成员函数里面可以直接访问结构体成员变量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文阅读 提升语言模型中的数学推理能力&#xff1a;问题求解数据、数据合成方法及训练阶段的影响 \begin{abstract} 数学推…

网络测试工具:涵盖网络测速、密码查看、故障判断与网络监测

在网络管理与维护的广阔领域中&#xff0c;网络测试工具扮演着至关重要的角色。它们不仅简化了复杂的网络诊断流程&#xff0c;还提升了工作效率。今天推荐一款包含功能全面的网络测试工具&#xff1a;InetTest&#xff0c;是一款免费且开源的网络测试工具&#xff0c;适用于Wi…

小刚说C语言刷题——1005 - 已知一个圆的半径,求解该圆的面积和周长

1.题目描述 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入 输入只有一行&#xff0c;只有 1个整数。 输出 输出只有两行&#xff0c;一行面积&#xff0c;一行周长。&#xff08;保留两位小数&#xff09;。 令 pi3.1415926。 样例 输入 1 输出 3.14 6.…