LeetCode算法日记 - Day 8: 串联所有单词的子串、最小覆盖子串

目录

1.串联所有单词的子串

1.2 解法

1.3 代码实现

2.  最小覆盖子串

2.1 题目解析

2.2 解法

2.3 代码实现


1.串联所有单词的子串

30. 串联所有单词的子串 - 力扣(LeetCode)

给定一个字符串 s 和一个字符串数组 words words 中所有字符串 长度相同

 s 中的 串联子串 是指一个包含  words 中所有字符串以任意顺序排列连接起来的子串。

  • 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd""cdabef", "cdefab""efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。

返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 "foobarthe" 开始位置是 6。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。
子串 "barthefoo" 开始位置是 9。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。
子串 "thefoobar" 开始位置是 12。它是 words 中以 ["the","foo","bar"] 顺序排列的连接。

1.1 题目解析

这道题可以类比于 438.找到字符串中所有字母的异位词,只不过这道题里,需要把字母换成子串。这个还有区别于 438 的地方是,438 是通过 for 循环里嵌套 while 循环来决定 起点 (也就是修改左指针位置),而这类则是通过 for 循环来决定起点。

1.2 解法

解法类似于 找到字符串中所有字母的异位词

i)定义两个 hash 表,一个用来存 words,一个用来存字符串 s

ii)进入循环,定义有效子串数量 count。

iii)进窗口:进窗口时后先进行 hash2.get(in)<=hash1.getOrDefault(in,0) 来判断是否为有效字符串。如果有效则使 count++,反之则 count 不变。

iiii)判断:ight-left+1>len*m,len 为单个词长度,m 为词的数量。通过限制窗口大小,来达成滑动窗口内都是该 words 的子串的数量。

iiiii)出窗口:出窗口前 hash2.get(out)<=hash1.getOrDefault(out,0) 来判断出窗口是否为有效子串。如果有效则使 count++,反之则 count 不变。

iiiiii)返回结果:当 count == m 时,则代表该窗口内都是 words 的子串。

1.3 代码实现

class Solution {public List<Integer> findSubstring(String s, String[] pp) {List<Integer> ret = new ArrayList<Integer>();Map<String,Integer> hash1 = new HashMap<String,Integer>();for(String p : pp){hash1.put(p, hash1.getOrDefault(p,0)+1);}int len = pp[0].length(), m = pp.length;for(int i = 0;i<len;i++){Map<String,Integer> hash2 = new HashMap<String,Integer>();//left 和 right 是在 s 上操作的for(int left = i,right = i,count = 0 ;right+len<=s.length();right+=len){String in = s.substring(right,right+len);hash2.put(in,hash2.getOrDefault(in,0)+1);if(hash2.get(in)<=hash1.getOrDefault(in,0)){count++;}if(right-left+1>len*m){String out = s.substring(left,left+len);if(hash2.get(out)<=hash1.getOrDefault(out,0)){count--;}hash2.put(out,hash2.get(out)-1);left+=len;}if(count==m){ret.add(left);}}}return ret;}
}

2.  最小覆盖子串

 76. 最小覆盖子串 - 力扣(LeetCode)

给你一个字符串 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

2.1 题目解析

这道题与之前所讲的滑动窗口不同,以往更新结果都是在判断后更新,而这次是在判断内更新结果。这道题因为涉及到每个单词都有可能重复,所以我们再用数量来判断就不合理了。因此我们需要判断字母的种类,窗口内的单个字母数量要等于字符串中单个字母的数量,才能进行种类加1。

这里的更新结果与之前有所不同,需要定一个 min_len 和 begin 来辅助返回结果,定义 kinds 来记录子串字符种类,count 来记录是否达到最小子串。

2.2 解法

i)先把字符串转成字符数组

ii)对 hash 表进行初始化,记录最小子串需要的字母种类和次数

iii)定义 min_len, begin, count, kinds 用来记录结果返回,定义双指针并进入 for 循环

iiii)进窗口:进窗口后判断 ++hash2[s[right]] == hash1[s[right]],如果成立则使 count++,这代表了完成子串其一的字符种类和数量

iiiii)判断:判断 count == kinds,如果成立则代表打成子串的要求,更新 min_len, begin 用来返回结果。

iiiiii)出窗口:出窗口前判断 hash2[s[left]]--==hash1[s[left]],如果成立 count--,反之则不变

iiiiiii)返回结果

2.3 代码实现

class Solution {public String minWindow(String ss, String tt) {char[] s = ss.toCharArray();char[] t = tt.toCharArray();int[] hash1 = new int[128];int kinds = 0;for(char ch : t){if(hash1[ch]++ == 0){kinds++;}}int[] hash2 = new int[128];int min_len = Integer.MAX_VALUE,begin = -1;for(int left =0,right = 0,count =0;right<s.length;right++){if(++hash2[s[right]] == hash1[s[right]]){count++;}while(count == kinds){//更新结果if(right-left+1 < min_len){min_len = right-left+1;begin = left;}if(hash2[s[left]]--==hash1[s[left]]){count--;}left++;}}if(begin == -1){return new String();}return ss.substring(begin,begin+min_len);}
}

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

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

相关文章

linux实战:基于Ubuntu的专业相机

核心组件就是QTimerOpenCV的组合方案摄像头启停控制用QPushButton实现&#xff0c;帧显示必须用QLabel而不能用普通控件&#xff0c;视频流刷新用QTimer比多线程更简单想快速实现摄像头控制功能&#xff0c;核心组件就是QTimerOpenCV的组合方案。摄像头启停控制用QPushButton实…

《深度剖析前端框架中错误边界:异常处理的基石与进阶》

错误边界作为一种特殊的组件机制&#xff0c;正悄然重塑着应用应对异常的底层逻辑。它并非简单的代码片段组合&#xff0c;而是一套贯穿组件生命周期的防护体系&#xff0c;其核心价值在于将局部错误的影响牢牢锁定在可控范围内&#xff0c;避免整个应用陷入不可挽回的崩溃状态…

6GB显存玩转SD微调!LoRA-scripts本地部署教程,一键炼出专属AI画师

一、介绍LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一个专为训练低秩自适应&#xff08;LoRA&#xff09;模型设计的开源工具集主要应用于Stable Diffusion等AI绘图模型的微调&#xff0c;帮助用户高效创建定制化风格、角色或概念的轻量级模型。目前已…

探索AI的数学奇迹:Gemini 2.5 Pro如何摘得IMO金牌

🌍 引言:从人类天才到AI奇才的跨越 想象一下,一个AI模型坐在国际数学奥林匹克(IMO)的考场里,手里拿着笔(好吧,其实是处理token),面对那些让高中生们头疼不已的难题。它不是靠死记硬背,而是通过深思熟虑的推理,一步步攻克难关。这听起来像科幻小说,但2025年,这已…

MCP学习与实践

目录 1.MCP简介 1.1 MCP是什么 1.2 MCP与Agent关系&#xff1a; 1.3 MCP的架构 2. MCP原理 2.1 MCP 工作过程 2.2 MCP 通讯方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地图MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文详细讲解了什么是…

MySQL(187)如何使用pt-query-digest进行查询分析?

使用 pt-query-digest 工具可以帮助分析 MySQL 查询的性能&#xff0c;找出慢查询、频繁查询以及消耗资源较多的查询&#xff0c;从而为优化提供依据。以下是详细深入的使用 pt-query-digest 进行查询分析的步骤和相关示例。 一、安装 pt-query-digest pt-query-digest 是 Perc…

分享一个基于Python和Hadoop的的电信客户特征可视化分析平台 基于Spark平台的电信客服数据存储与处理系统源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

初识STL

一 、STL的诞生在C发展早期&#xff0c;程序员在不同的项目中需要反复编写相似的数据结构和算法。重复开发带来以下问题&#xff1a;代码冗余&#xff1a;每个项目都要重新实现基本数据结构和算法维护困难&#xff1a;不同人编写的代码风格不一致&#xff0c;难以维护效率低下&…

DDoS 防护的未来趋势:AI 如何重塑安全行业?

随着网络攻击规模和复杂性的不断升级&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击已成为企业数字化转型中的一大威胁。传统防御手段在应对智能化、动态化的攻击时逐渐显露出局限性。而人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;正为 DDoS 防护…

【每天一个知识点】深度领域对抗神经网络

Deep Domain Adversarial Neural Network&#xff08;深度领域对抗神经网络&#xff0c;DDANN&#xff09; 是一类结合 深度学习 与 领域自适应&#xff08;domain adaptation&#xff09; 思想的神经网络结构&#xff0c;主要用于不同数据域之间的知识迁移&#xff0c;尤其是在…

【C语言】深入理解预处理

文章目录一、预定义符号二、#define定义常量&#xff1a;便捷的符号替换常见用法示例&#xff1a;注意事项&#xff1a;三、#define定义宏&#xff1a;带参数的文本替换关键注意点&#xff1a;四、带有副作用的宏参数五、宏替换的规则&#xff1a;预处理的执行步骤重要注意&…

展锐平台(Android15)WLAN热点名称修改不生效问题分析

前言 在展锐Android V项目开发中&#xff0c;需要修改softAp/P2P热点名称时&#xff0c;发现集成GMS后直接修改framework层代码无效。具体表现为&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法编译烧录后修改不生效 问题根源在…

wsl ubuntu访问(挂载)vmware vmdk磁盘教程

之前使用VMware Workstation 虚拟机跑了个ubuntu&#xff0c;现在改用wsl了&#xff0c; 想把vmware的磁盘挂载到wsl ubuntu。一、磁盘合并我原先的vmware跑的ubuntu存在多个vmdk文件&#xff08;磁盘文件&#xff09;&#xff0c;需要先将磁盘合并成一个才方便挂载。首先你电脑…

UGUI源码剖析(3):布局的“原子”——RectTransform的核心数据模型与几何学

UGUI源码剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心数据模型与几何学 在前几章中&#xff0c;我们了解了UGUI的组件规范和更新调度机制。现在&#xff0c;我们将深入到这个系统的“几何学”核心&#xff0c;去剖析那个我们每天都在…

c++注意点(15)----设计模式(桥接模式与适配器模式)

一、结构型设计模式两者有点相似&#xff0c;都是为了做到解耦的功能。适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&…

DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!

作为我常用的一款还不错的跨境工具&#xff0c;DuoPlus云手机帮我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和优化&#xff0c;今天来聊聊它最近新更新的一些功能。功能更新一览新增导入文件配置参数&#xff1a;批量初始化代理、批量修改参数支持导入文件一键配…

PLC如何实现通过MQTT协议物联网网关接入管理云平台

在工业4.0与智能制造浪潮下&#xff0c;企业亟需实现设备数据的高效采集与云端协同&#xff0c;以支撑远程监控、预测性维护等场景。工业智能网关凭借其强大的协议解析能力、边缘计算功能及安全传输机制&#xff0c;成为PLC接入云平台的核心解决方案。本文将从技术架构、功能模…

通过sealos工具在ubuntu 24.02上安装k8s集群

一、系统准备&#xff08;1&#xff09;安装openssh服务 sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh&#xff08;2&#xff09;放通防火墙 sudo ufw allow ssh&#xff08;3&#xff09;开通root直接登录 vim /etc/ssh/sshd_config#…

nginx+Lua环境集成、nginx+Lua应用

nginxluaredis实践 概述 nginx、lua访问redis的三种方式&#xff1a; 1。 HttpRedis模块。 指令少&#xff0c;功能单一 &#xff0c;适合简单的缓存。只支持get 、select命令。 2。 HttpRedis2Module模块。 功能强大&#xff0c;比较灵活。 3。 lua-resty-redis库 OpenResty。…

机器学习 K-Means聚类 无监督学习

目录 K-Means 聚类&#xff1a;从原理到实践的完整指南 什么是 K-Means 聚类&#xff1f; 应用场景举例 K-Means 算法的核心原理 K-Means 算法的步骤详解 可视化理解 K-Means 的优缺点分析 优点 缺点 如何选择合适的 K 值&#xff1f; 1. 肘部法&#xff08;Elbow Me…