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、通过对滑动窗口前两个题型的总结,我们几乎已经习惯在给定的一个序列里使用滑动窗口的模板解题了,本次对应的“三、两个序列窗口定长类型”,也是考察连续子数组、连续子串问题,只不过这次会给定两个序列,判断短序列在…...
一个简单的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个节点,AB训练集各由5张二值化的图片组成,让A中有2个1,B中有1个1,且不重合,排列组合,统计迭代次数并排序。 其中有6组数据 构造平均列A 构造平均…...
表现层消息一致性处理
设计表现层返回结果的模型类, 用于后端与前端进行数据格式统一,也称为前后端数据协议 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到数据库的流程与结构。
博客管理系统是一个典型的前后端分离的应用,其中前端使用Vue框架进行开发,后端使用Spring Boot框架进行开发,数据库使用MySQL进行存储。下面是从对接Vue到数据库的完整流程和结构。 对接Vue 在前端Vue应用中,需要访问后端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,用于修改内存访问权限* 参数1:指向内存的指针* 参数2:内存大小(以字节为单位…...
npm yarn pnpm npx nvm 命令怎么区分怎么用
npm 包管理器,可以用来安装、卸载、更新和管理各种包npm的package.json中文文档 参数 - install:安装一个或多个包。例如:npm install 。 uninstall:卸载一个包。例如:npm uninstall 。 update…...
解锁市场进入成功:GTM 策略和即用型示例
在最初的几年里,创办一家初创公司可能会充满挑战。根据美国小企业管理局的数据,大约三分之二的新成立企业存活了两年,几乎一半的企业存活了五年以上。导致创业失败的因素有市场需求缺失、资金短缺、团队不合适、成本问题等。由此,…...
深度学习12:胶囊神经网络
目录 研究动机 CNN的缺陷 逆图形法 胶囊网络优点 胶囊网络缺点 研究内容 胶囊是什么 囊间动态路由算法 整体框架 编码器 损失函数 解码器 传统CNN存在着缺陷(下面会详细说明),如何解决CNN的不足,Hinton提出了一种对于图…...
unity 提取 字符串中 数字 修改后返回 字符串
参考博主:unity 提取字符串数字修改后返回字符串_unity string提取数字_lvcoc的博客-CSDN博客 正数和浮点数的 正则表达式 //正则表达式//const string pattern "\d";//表达1位或多位的整数数字 const string pattern "\d\.\d";//表达1位或…...
GWO-LSTM交通流量预测(python代码)
使用 GWO 优化 LSTM 模型的参数,从而实现交通流量的预测方法 代码运行版本要求 1.项目文件夹 data是数据文件夹,data.py是数据归一化等数据预处理脚本 images文件夹装的是不同模型结构打印图 model文件夹 GWO-LSTM测试集效果 效果视频: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安装教程 一,卸载MySQL二,安装MySQL三,mysql登录四,修改配置文件 一,卸载MySQL 1.如果你的机器上mysqld服务器还在运行,那么第一步就是要停掉服务。 systemctl stop mysqld;2.查看系统中安装的关于m…...
nginx配置SSL证书配置https访问网站 超详细(附加配置源码+图文配置教程)
最近在阿里云上入手了一台云服务器,准备搭建一套java程序,在Nginx配置SSL证书时,配上之后前端可以正常以https的方式打开,但是访问不到后端,自己也是明明知道是Niginx配置的问题,但就不知道错哪了ÿ…...
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 中,有几种特殊的 Volume,它们的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。" 从容器的角度来看,这些 Volume…...
DevOps团队如何提高Kubernetes性能
今天,Kubernetes仍然是开发人员最需要的容器。Kubernets最初由 Google 工程师开发,作为跨本地、公共云、私有云或混合云托管的首选解决方案享誉全球。 来自Statista的报告显示,公共云中的Kubernetes市场份额在过去一年中上升了近30%。并且在…...
Fast-GitHub:打破GitHub访问壁垒的智能加速方案
Fast-GitHub:打破GitHub访问壁垒的智能加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否曾因GitHub仓库克…...
柔性LED灯丝DIY:从电路原理到创意饰品制作全攻略
1. 项目概述:当生日遇上柔性LED灯丝给孩子的生日派对准备一份独一无二的、会发光的惊喜,是很多家长和手工爱好者的心愿。这次,我们不买现成的塑料灯牌,而是亲手做一个能戴在头上或挂在脖子上的“生日数字灯冠”。这个项目的核心&a…...
安全聚合技术:原理、实现与多场景应用
1. 安全聚合技术概述安全聚合(Secure Aggregation)是一种多方安全计算技术,它允许多个互不信任的参与方在不泄露各自私有数据的前提下,共同计算出一个聚合结果。这项技术的核心价值在于解决了数据隐私与数据共享之间的矛盾&#x…...
Linuxbonding链路稳定性治理方法
Linuxbonding链路稳定性治理方法这是一篇面向中级 Linux 使用者的技术文章,主题聚焦在bonding链路,重点讨论链路聚合、冗余切换和接口状态。在真实生产环境中,bonding链路相关问题往往不会以单一错误形式出现,而是混杂在日志、权限…...
Biomni:生物医学图像分析从入门到精通,AI与传统CV融合实战
1. 项目概述:当AI学会“看”懂生物医学图像如果你在生物医学研究、药物发现或者临床诊断领域工作,大概率会和我一样,对海量的生物医学图像数据感到既兴奋又头疼。兴奋的是,这些图像——无论是显微镜下的细胞切片、组织病理学玻片&…...
别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码)
别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码) 科研图表的美观程度直接影响论文的第一印象,而三维柱状图在展示多维度数据时尤为常见。传统手动调整每个柱体的颜色、透明度、光照效果不仅耗时&#…...
基于RAG与向量数据库的智能信息管理系统(IIMS)架构与实现
1. 项目概述:当AI成为你的“第二大脑”最近在折腾一个挺有意思的项目,叫“IIMS-By-AI”。乍一看这个标题,可能有点摸不着头脑,但拆解一下就能明白它的野心:IntelligentInformationManagementSystem, By AI。…...
【ElevenLabs匈牙利语音实战指南】:2024最新API调用、音色微调与本地化合规避坑全解析
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs匈牙利语音支持概览与本地化价值定位 ElevenLabs 自 2024 年 3 月起正式引入匈牙利语(hu-HU)语音合成支持,成为其首批覆盖的中东欧语言之一。该能力依托于…...
RTKLIB 2.4.3项目在Visual Studio 2019中的工程化配置:告别零散文件,打造清晰结构
RTKLIB 2.4.3项目在Visual Studio 2019中的工程化配置:告别零散文件,打造清晰结构 对于卫星导航领域的开发者而言,RTKLIB无疑是一个绕不开的开源项目。这个由日本学者Tomoji Takasu开发的GNSS定位软件,以其强大的功能和开放的架构…...
AI异步任务编排引擎:从原理到实战,构建可靠工作流系统
1. 项目概述:AI驱动的异步任务编排引擎在当今的软件开发领域,尤其是涉及数据处理、机器学习模型训练、自动化工作流等场景时,我们常常会面临一个核心挑战:如何高效、可靠地编排和管理一系列耗时且可能相互依赖的异步任务。传统的解…...
