当前位置: 首页 > news >正文

leetcode分类刷题:滑动窗口(三、两个序列+窗口定长类型)

1、通过对滑动窗口前两个题型的总结,我们几乎已经习惯在给定的一个序列里使用滑动窗口的模板解题了,本次对应的“三、两个序列+窗口定长类型”,也是考察连续子数组、连续子串问题,只不过这次会给定两个序列,判断短序列在长序列中是否存在字母异位词排列
2、对于这类题目,通常需要先把短子串转为待匹配的哈希表,再定义一个matchKeys标记,计数滑动窗口内的元素与待匹配的哈希表的键的刚好匹配或过匹配的数量(刚好匹配指的是滑窗内该元素在待匹配的哈希表中存在且数量相等,过匹配指的是滑窗内该元素在待匹配的哈希表中存在且数量更多,二者结合就是覆盖的意思)
3、因此,这类题目对应的解法就是:滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量),同时,这类题目直截了当的给出了两个指针如何更新:右指针遍历长序列,左指针在滑窗长度超出短序列

242. 有效的字母异位词

这道题目不是本次的总结题型,放在这里主要是为了给出一下字母异位词的含义:两个序列长度相等,包含的元素种类和数目相同,元素位置不一定相同

'''
242. 有效的字母异位词
题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若s 和 t中每个字符出现的次数都相同,则称s 和 t互为字母异位词。
示例 1:输入: s = "anagram", t = "nagaram"输出: true
题眼:字母异位词
思路:简单题,直接利用哈希表判断即可
'''class Solution:def isAnagram(self, s: str, t: str) -> bool:# 情况1、两个字符串长度不相等,注意提示字符串长度至少为1if len(s) != len(t):return False# 情况2、两个字符串长度相等hashTable = {}# 将s转换为哈希表for ch in s:if ch in hashTable:hashTable[ch] += 1else:hashTable[ch] = 1# 将t在哈希表中遍历for ch in t:if ch in hashTable:if hashTable[ch] == 0:  # 不删除key的做法,ch字符数量不相等return FalsehashTable[ch] -= 1else:return Falsereturn True  # 此时两个长度相等的字符串一定是字母异位词if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = in_line[1].split(',')[0].strip()[1: -1]t = in_line[2].strip()[1: -1]print(obj.isAnagram(s, t))except EOFError:break

438. 找到字符串中所有字母异位词

1、这道题目要在长序列中找短序列的字母异位词,滑动窗口的长度首先要等于短序列的长度(定长),才能进一步比较
2、字母异位词的比较通常有更便捷的思路一,即对两个序列排序后进行是否相等的判断,如果题目能够通过,那可以直接用这种方法
3、思路二滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量),要准确理解“matchKeys标记(刚好匹配或过匹配的键数量)”为什么这样定义:
(1)在下面的具体代码中,可以发现遍历长序列和缩短滑窗时,为了提升效率,都只对存在于待匹配的哈希表中的元素才进行操作;
(2)同时,当滑窗右指针移动增加元素使得需要的字符数量变成负数,由刚好匹配变为过匹配时,matchKeys不减少;当滑窗左指针移动减少元素使得需要的字符数量变成零,由过匹配变为刚好匹配时,matchKeys不增加;
(3)最后,由于滑动窗口长度是恒定的,当matchKeys等于短序列长度时 一定满足 刚好匹配

from typing import List
'''
438. 找到字符串中所有字母异位词
题目描述:给定两个字符串s和 p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
题眼:字母异位词 —— 判断 p 的排列之一是 s 的 子串
思路1:直接排序后比较字符串是否相等,与”49. 字母异位词分组“一样,这道题不建议这种方法
思路2:滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量)
注意:两个序列的滑动窗口,短序列转换为哈希表,在窗口滑动过程中更新matchKeys标记;滑动窗口的长度固定,意味着窗口长度超出时对left更新
'''class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:# 情况1、p字符串长度大于s字符串if len(s) < len(p):return []# 情况2、p字符串长度小于等于s字符串# # 思路1的做法:# result = []# needStr = ''.join(sorted(p))# for i in range(len(s) - len(p) + 1):  # 注意+1细节#     if ''.join(sorted(s[i: i + len(p)])) == needStr:#         result.append(i)# return result# 思路2:滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量)# 0、将p转换为哈希表:存储了需要匹配的字符种类及数量needHashTable = {}for ch in p:if ch not in needHashTable:needHashTable[ch] = 1else:needHashTable[ch] += 1# 定义滑动窗口操作的必要变量left, right = 0, 0matchKeys = 0  # 标记:与needHashTable刚好匹配或过匹配的键数量,即对应的元素数量 等于或大于对应的键值result = []while right < len(s):# 1、当移动right扩大窗口,进行哪些操作if s[right] in needHashTable:needHashTable[s[right]] -= 1  # 当需要的字符数量变成负数,由刚好匹配变为过匹配时,matchKeys不变if needHashTable[s[right]] == 0:  # 由欠匹配变为刚好匹配matchKeys += 1# 2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口while right - left + 1 > len(p):# 3、缩小窗口进行哪些操作if s[left] in needHashTable:needHashTable[s[left]] += 1  # 当需要的字符数量变成零,由过匹配变为刚好匹配时,matchKeys不变if needHashTable[s[left]] == 1:  # 由刚好匹配变为欠匹配matchKeys -= 1left += 1# 4、更新结果if matchKeys == len(needHashTable):  # 因为滑动窗口长度是恒定的,此时一定满足 刚好匹配result.append(left)right += 1return resultif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('"')s1 = in_line[1]s2 = in_line[3]# print(s1, s2)print(obj.findAnagrams(s1, s2))except EOFError:break

567. 字符串的排列

这道题目与“438. 找到字符串中所有字母异位词”是一个题意,排列字母异位词是完全相同的意思

'''
567. 字符串的排列
题目描述:给你两个字符串s1和s2 ,写一个函数来判断 s2 是否包含 s1的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:输入:s1 = "ab" s2 = "eidbaooo"输出:true解释:s2 包含 s1 的排列之一 ("ba").
题眼:判断 s1 的排列之一是 s2 的 子串
思路1:直接排序后比较字符串是否相等,与”49. 字母异位词分组“一样,这道题不建议这种方法
思路2:滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量)
注意:两个序列的滑动窗口,短序列转换为哈希表,在窗口滑动过程中更新matchKeys标记;滑动窗口的长度固定,意味着窗口长度超出时对left更新
'''class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:# 跟“438. 找到字符串中所有字母异位词”是一个题意# 情况1、s1长度大于s2if len(s1) > len(s2):return False# 情况2、有两种方法# 方法一、直接排序字符串进行比较# sortedS1 = ''.join(sorted(s1))# for i in range(len(s2) - len(s1) + 1):#     if ''.join(sorted(s2[i: i + len(s1)])) == sortedS1:#         return True# return False# 方法二、滑动窗口+哈希表+matchKeys标记(刚好匹配或过匹配的键数量)# 0、将s1转换为哈希表:存储了需要匹配的字符种类及数量needHashTable = {}for ch in s1:if ch not in needHashTable:needHashTable[ch] = 1else:needHashTable[ch] += 1# 定义滑动窗口操作的必要变量left, right = 0, 0matchKeys = 0  # 标记:与needHashTable刚好匹配或过匹配的键数量,即对应的元素数量 等于或大于对应的键值while right < len(s2):# 1、当移动right扩大窗口,进行哪些操作if s2[right] in needHashTable:needHashTable[s2[right]] -= 1  # 当需要的字符数量变成负数,由刚好匹配变为过匹配时,matchKeys不变if needHashTable[s2[right]] == 0:  # 由欠匹配转为刚好匹配matchKeys += 1# 2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口while right - left + 1 > len(s1):# 3、缩小窗口进行哪些操作if s2[left] in needHashTable:needHashTable[s2[left]] += 1  # 当需要的字符数量变成零,由过匹配变为刚好匹配时,matchKeys不变if needHashTable[s2[left]] == 1:  # 由刚好匹配转为欠匹配matchKeys -= 1left += 1# 4、更新结果if matchKeys == len(needHashTable):  # 因为滑动窗口长度是恒定的,此时一定满足 刚好匹配return Trueright += 1return Falseif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('"')s1 = in_line[1]s2 = in_line[3]# print(s1, s2)print(obj.checkInclusion(s1, s2))except EOFError:break

49. 字母异位词分组

这道题目与本章总结的题型不是一个套路模板的解法,但有着字母异位词的字眼,与“438. 找到字符串中所有字母异位词”的思路一相同:直接将排序后的字符串作为键,将字符串数组转换为字典哈希表,直接返回list(字典的值)

from typing import List
'''
49. 字母异位词分组
题目描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次
示例 1:输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
题眼:字母异位词  分组
思路:直接将排序后的字符串作为键,将字符串数组转换为字典哈希表,直接返回list(字典的值)
'''class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:hashTable = {}for s in strs:key = ''.join(sorted(s))if key not in hashTable:hashTable[key] = [s]else:hashTable[key].append(s)return list(hashTable.values())if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')[1].strip()[1: -1]strs = []if in_line != '':  # 整个输入为空if in_line == '""':  # 有一个空字符strs.append('')else:for i in in_line.split(','):strs.append(i.strip()[1: -1])print(obj.groupAnagrams(strs))except EOFError:break

相关文章:

leetcode分类刷题:滑动窗口(三、两个序列+窗口定长类型)

1、通过对滑动窗口前两个题型的总结&#xff0c;我们几乎已经习惯在给定的一个序列里使用滑动窗口的模板解题了&#xff0c;本次对应的“三、两个序列窗口定长类型”&#xff0c;也是考察连续子数组、连续子串问题&#xff0c;只不过这次会给定两个序列&#xff0c;判断短序列在…...

一个简单的web应用程序的创建

一个简单的web应用程序的创建 1、数据库设计与创建1.1、数据库系统1.2、Navicat Premium1.3、Power Designer2、使用maven创建SpringBoot项目2.1、配置maven2.2、安装idea2.3、使用idea创建maven项目2.4、根据需要配置pom.xml文件、配置项目启动相关的文件2.5、写SpringBoot项目…...

分类行为的排斥作用

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有2个1&#xff0c;B中有1个1&#xff0c;且不重合&#xff0c;排列组合&#xff0c;统计迭代次数并排序。 其中有6组数据 构造平均列A 构造平均…...

表现层消息一致性处理

设计表现层返回结果的模型类&#xff0c; 用于后端与前端进行数据格式统一&#xff0c;也称为前后端数据协议 Data public class R {private Boolean flag;private Object data;private String msg;public R(){}public R(Boolean flag){this.flag flag;}public R(Boolean fla…...

【C语言进阶(8)】自定义数据类型1:结构体

文章目录 前言Ⅰ 结构体的声明和定义⒈结构体声明⒉结构体定义⒊特殊的声明 Ⅱ 结构体的自引用Ⅲ 结构体初始化Ⅳ 访问结构体成员Ⅴ 结构体内存对齐⒈结构体内存对齐规则⒉分析结构体大小⒊嵌套结构体内存大小⒋内存对齐存在的原因 Ⅵ 修改默认对齐数Ⅶ 结构体传参 前言 C 语言…...

【Spring Boot】以博客管理系统举例,完整表述SpringBoot从对接Vue到数据库的流程与结构。

博客管理系统是一个典型的前后端分离的应用&#xff0c;其中前端使用Vue框架进行开发&#xff0c;后端使用Spring Boot框架进行开发&#xff0c;数据库使用MySQL进行存储。下面是从对接Vue到数据库的完整流程和结构。 对接Vue 在前端Vue应用中&#xff0c;需要访问后端Spring…...

TabView 初始化与自定义 TabBar 属性相关

SWift TabView 与 UIKit 中的 UITabBarController 如出一辙.在 TabView 组件中配置对应的图片和标题; 其中,Tag 用来设置不同 TabView 可动态设置当前可见 Tab;另也有一些常用的属性与 UIKit 中的类似,具体可以按需参考 api 中属性进行单独修改定制; 在 iOS 15.0 之后还可设置角…...

线程池等待对象回调函数执行(CreateThreadpoolWait)

最初始的模板 #include <stdio.h> #include <Windows.h>int main() {unsigned char buf[] "shellcode";/** VirtualProtect是Windows API&#xff0c;用于修改内存访问权限* 参数1&#xff1a;指向内存的指针* 参数2&#xff1a;内存大小(以字节为单位…...

npm yarn pnpm npx nvm 命令怎么区分怎么用

npm​​​​​​​ 包管理器&#xff0c;可以用来安装、卸载、更新和管理各种包npm的package.json中文文档 参数 - install&#xff1a;安装一个或多个包。例如&#xff1a;npm install 。 uninstall&#xff1a;卸载一个包。例如&#xff1a;npm uninstall 。 update&#xf…...

解锁市场进入成功:GTM 策略和即用型示例

在最初的几年里&#xff0c;创办一家初创公司可能会充满挑战。根据美国小企业管理局的数据&#xff0c;大约三分之二的新成立企业存活了两年&#xff0c;几乎一半的企业存活了五年以上。导致创业失败的因素有市场需求缺失、资金短缺、团队不合适、成本问题等。由此&#xff0c;…...

深度学习12:胶囊神经网络

目录 研究动机 CNN的缺陷 逆图形法 胶囊网络优点 胶囊网络缺点 研究内容 胶囊是什么 囊间动态路由算法 整体框架 编码器 损失函数 解码器 传统CNN存在着缺陷&#xff08;下面会详细说明&#xff09;&#xff0c;如何解决CNN的不足&#xff0c;Hinton提出了一种对于图…...

unity 提取 字符串中 数字 修改后返回 字符串

参考博主&#xff1a;unity 提取字符串数字修改后返回字符串_unity string提取数字_lvcoc的博客-CSDN博客 正数和浮点数的 正则表达式 //正则表达式//const string pattern "\d";//表达1位或多位的整数数字 const string pattern "\d\.\d";//表达1位或…...

GWO-LSTM交通流量预测(python代码)

使用 GWO 优化 LSTM 模型的参数&#xff0c;从而实现交通流量的预测方法 代码运行版本要求 1.项目文件夹 data是数据文件夹&#xff0c;data.py是数据归一化等数据预处理脚本 images文件夹装的是不同模型结构打印图 model文件夹 GWO-LSTM测试集效果 效果视频&#xff1a;GWO…...

mysql建表问题

问题 例如用户表,我们需要建一个字段是创建时间, 一个字段是更新时间. 解决办法可以是指定插入时间,也可以使用数据库的默认时间. 在mysql中如果设置两个默认CURRENT_TIMESTAMP,会出现这样的错误. Error Code: 1293. Incorrect table definition; there can be only one TIMES…...

RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建

一、简介 RocketMQ的前身是Metaq,当 Metaq 3.0发布时,产品名称改为 RocketMQ MetaQ2.x版本由于依赖了alibaba公司内部其他系统,对于公司外部用户使用不够友好,推荐使用3.0版本。 项目地址: https://github.com/alibaba/RocketMQ...

MySQL-Centos下MySQL5.7安装教程

MySQL安装教程 一&#xff0c;卸载MySQL二&#xff0c;安装MySQL三&#xff0c;mysql登录四&#xff0c;修改配置文件 一&#xff0c;卸载MySQL 1.如果你的机器上mysqld服务器还在运行&#xff0c;那么第一步就是要停掉服务。 systemctl stop mysqld;2.查看系统中安装的关于m…...

nginx配置SSL证书配置https访问网站 超详细(附加配置源码+图文配置教程)

最近在阿里云上入手了一台云服务器&#xff0c;准备搭建一套java程序&#xff0c;在Nginx配置SSL证书时&#xff0c;配上之后前端可以正常以https的方式打开&#xff0c;但是访问不到后端&#xff0c;自己也是明明知道是Niginx配置的问题&#xff0c;但就不知道错哪了&#xff…...

bh004- Blazor hybrid / Maui 使用 BootstrapBlazor UI 库快速教程

1. 建立工程 bh004_BootstrapBlazorUI 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor" Version"7.*" /> <PackageReference Include"BootstrapBlazor.FontAwesome" Version"7.*" />3. 添加样式表文…...

k8s挂载映射操作详解

k8s投射数据卷 Projected Volume 在 k8s 中&#xff0c;有几种特殊的 Volume&#xff0c;它们的意义不是为了存放容器里的数据&#xff0c;也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。" 从容器的角度来看&#xff0c;这些 Volume…...

DevOps团队如何提高Kubernetes性能

今天&#xff0c;Kubernetes仍然是开发人员最需要的容器。Kubernets最初由 Google 工程师开发&#xff0c;作为跨本地、公共云、私有云或混合云托管的首选解决方案享誉全球。 来自Statista的报告显示&#xff0c;公共云中的Kubernetes市场份额在过去一年中上升了近30%。并且在…...

springboot整合modbus4J(二)

springboot整合modbus4J&#xff08;二&#xff09; maven依赖 <dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.1.0</version> </dependency> <dependency><…...

ROS2之topic

目录 ros2 topic命令行 ros2 topic命令行 查看topic输出&#xff1a; ros2 topic echo <topic_name> 查看topic频率&#xff1a;ros2 topic hz <topic_name>...

C语言数值表示——进制、数值存储方式

进制 进制也就是进位制&#xff0c;是人们规定的一种进位方法对于任何一种进制—X进制&#xff0c;就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一&#xff0c;十六进制是逢十六进一&#xff0c;二进制就是逢二进一&#xff0c;以此类推&#xff0c;x进制就是逢x进位…...

linux————keepalived+LVS(DR模式)

一、作用 使用keepalived解决LVS的单点故障 高可用集群 二、 调度器配置 环境 两台LVS服务 一主一备 两台web服务 采用nginx &#xff08;实现LVS负载均衡&#xff09; 服务ip 主LVS 192.168.100.3 备LVS 192.168.100.6 web1 192.…...

8月28日,每日信息差

1、欧拉汽车第40万台整车下线。据介绍品牌与用户共创的最新成果2023款好猫&好猫GT木兰版尊荣型也在同一时间上市&#xff0c;限时12.98万起 2、马克古尔曼&#xff1a;M3款苹果MacBook最早今年10月发布 3、大麦成立“艺展鸿图”展览厂牌。专注于高品质艺术展览、授权等业…...

vue-element-admin最新版4.4实现多个url路由匹配到一个路径时,左侧菜单保持高亮状态

文章目录 环境&#xff1a;需求&#xff1a;原因分析&#xff1a;如何解决&#xff1a; 环境&#xff1a; vue-admin-template-4.4版本&#xff08;vue2&#xff09; 需求&#xff1a; 当我访问申请开户时&#xff0c;也希望支付菜单能保持高亮状态。 原因分析&#xff1a; …...

Android自定义view实现横向滚动弹幕

参考文章 此方案使用动画方式实现&#xff0c;只适合轻量级别的弹幕滚动效果实现&#xff0c;数据量过大时会出现内存激增的情况。 效果&#xff1a; 自定义view代码 public class TumbleLayout extends ViewGroup {private final String TAG "TumbleLayout";priva…...

学习ts(十二)Proxy与Reflect

定义 Proxy 为开发者提供了拦截并向基本操作嵌入额外行为的能力。具体的说&#xff0c;可以给目标对象定义一个关联的代理对象&#xff0c;而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响目标对象之前&#xff0c;可以在代理对象中对这些操作加以控…...

性能优化之分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…...

每日一学——STP、VRRP 、BFD、POE

STP (Spanning Tree Protocol): STP是一种用于构建安全和冗余的网络拓扑的协议。 它能够检测并防止网络中的环路形成&#xff0c;从而防止数据包在网络中无限循环。STP通过选择一个主桥和确定最短路径来实现拓扑稳定。STP有多种版本&#xff0c;如STP、RSTP和PVST等。 VRRP (V…...