LeetCode100之找到字符串中所有字母异位词(438)--Java
1.问题描述
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例1
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例2
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
提示
1 <= s.length, p.length <= 3 * 104s和p仅包含小写字母
难度等级
中等
题目链接
找到字符串中所有字母异位词
2.解题思路
这道题要我们找出s字符串中p的所有字母异位词,首先我们可以知道的就是,既然是要找p的字母异位词,那我们从s中找的子串长度就必须和p一样,那么我们也就可以向排除一些情况,那就是如果s的长度比p的长度还小,那s中就不可能有p的字母异位词了。
//获取字符串的长度int sLength = s.length();//窗口大小int pLength = p.length();//如果s的长度小于p的长度,s中不可能有p的字母异位词if(sLength < pLength){return new ArrayList<>();}
接着,因为p的长度是固定的,我们要在s中寻找p长度的子串,如果了解过滑动窗口的人,很容易就可以想到,我们可以用滑动窗口来寻找s中是p的字母异位词的子串,窗口的大小就是p的长度。
由于字母异位词字符随便排序的问题,我们无法通过正常的比较来判断我们找到的子串是否为p的字母异位词,但是字母异位词无序但字母个数一定的这个特点给我们提供了突破口。我们可以通过比较p中各个字符出现的次数是否与我们在s中找到的子串的字符个数相等,是的话,我们找到的子串就是那个排序可能与p不同的字母异位词了。
解决了如何找到字母异位词的思路之后,我们还有解决的一个问题就是用什么来存储字符出现个数的问题。我想大家对key-value的数据类型应该不陌生吧,我们可以使用key-value的结果来存储字符出现的个数,从而实现O(1)时间复杂度的增加和修改。提到key-value类型,大部分人应该第一时间就能想到用hashMap来存储。但是在这道题里面,可以不用hashMap来存储,可以直接使用数组来存储即可。由于题目告诉我们,s和p仅包含小写字母,也就数说顶天了也就只有26个字符,而且它们的ASCII码都是连续的,所以我们可以将字符减去第一个小写字母'a'的ASCII码,就可以将它们与数组的索引按顺序匹配起来,所以我们可以只有数据就来实现26个小写字母的key-value的统计。
//初始化两个数组用于存储字母出现的次数int[] sArr = new int[26];int[] pArr = new int[26];
创建完两个用于统计的数组之后,我们就可以开始初始化这两个数组了。将p从所有出现的字符统计到pArr(统计p的数组)中,并将s中前pLength(窗口大小)个字符统计到sArr(统计s子串的字符)中,这样我们就实现了两个统计数组的初始化了。我们再定义一个List集合用于存储所有的结果,我们的准备工作就做完了。
//存储异位词子串起始索引List<Integer> data = new ArrayList<>();//初始化两个数组(统计p中的字符个数并且统计s的前pLength个字符的个数)for(int i = 0;i < pLength;i++){sArr[s.charAt(i) - 'a']++;pArr[p.charAt(i) - 'a']++;}
接着,我们就可以来开始遍历s字符串了,因为我们已经统计了一部分字符串,所以我们可以先比较当前窗口中的子串是否和p是字母异位词,比较两个数组中各个字符的数量是否相等,是的话,则将窗口的起始索引(当前索引-窗口大小)存入List集合中。比较完之后,窗口开始向当前索引滑动,减去统计数组中窗口左边界的字符次数,因为它被滑出了,不在窗口之内了,然后再加上当前索引的字符的次数,因为窗口滑动后将它包含在内了。
//比较两个窗口中字符出现的个数是否相等,是则为字母异位词if(Arrays.equals(sArr,pArr)){//i-窗口大小即为起始索引data.add(i - pLength);}//移动窗口,减去移动前左边界的字符sArr[s.charAt(i-pLength) - 'a']--;//加上移动后右边界的字符sArr[s.charAt(i) - 'a']++;
不断的重复上述操作,知道窗口滑到s字符串的最右边为止。
退出循环之后,最后比较一下窗口中的子串是否为p的字母异位词,因为最后一次滑动之后,不会再进入循环,所以最后一次滑动没有去判断是否为字母异位词,要给它不上。
//最后再比较一次是否是字母异位词if(Arrays.equals(sArr,pArr)){data.add(sLength - pLength);}
补上最后一次判断之后,就可以直接返回结果了。
3.代码展示
class Solution {public List<Integer> findAnagrams(String s, String p) {//获取字符串的长度int sLength = s.length();//窗口大小int pLength = p.length();//如果s的长度小于p的长度,s中不可能有p的字母异位词if(sLength < pLength){return new ArrayList<>();}//初始化两个数组用于存储字母出现的次数int[] sArr = new int[26];int[] pArr = new int[26];//存储异位词子串起始索引List<Integer> data = new ArrayList<>();//初始化两个数组(统计p中的字符个数并且统计s的前pLength个字符的个数)for(int i = 0;i < pLength;i++){sArr[s.charAt(i) - 'a']++;pArr[p.charAt(i) - 'a']++;} //开始遍历(从pLength开始)for(int i = pLength;i < sLength;i++){//比较两个窗口中字符出现的个数是否相等,是则为字母异位词if(Arrays.equals(sArr,pArr)){//i-窗口大小即为起始索引data.add(i - pLength);}//移动窗口,减去移动前左边界的字符sArr[s.charAt(i-pLength) - 'a']--;//加上移动后右边界的字符sArr[s.charAt(i) - 'a']++;}//最后再比较一次是否是字母异位词if(Arrays.equals(sArr,pArr)){data.add(sLength - pLength);}return data;}}
4.总结
这道题的难点主要在于能不能想到用字符的个数是否相等来判断是否为字母异位词,至于用什么数据结构来存储字母的个数,其实都可以,只是用数组比直接用hashMap更加节省空间罢了,直接用hashMap也可以解决这道题,差别不是很大。好了,今天这道题就啰嗦到这里了,祝大家早日拿到offer!
相关文章:
LeetCode100之找到字符串中所有字母异位词(438)--Java
1.问题描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例1 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 …...
【Python】Python自习课:第一个python程序
【Python】Python自习课:第一个python程序...
DICOM标准:解析DICOM属性中的病人模块
目录 病人模块概述 1. 病人关系模块(Patient Relationship Module) 2. 病人识别模块(Patient Identification Module) 3. 病人统计模块(Patient Demographic Module) 4. 病人医学模块(Pati…...
C++设计模式创建型模式———生成器模式
文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式,工厂模式的主要特点是生成对象。当对象较简单时,可以使用简单工厂模式或工厂模式;而当对象相对复杂时,则可以选择使用抽象工厂模式。 工…...
基于微信小程序的校园失物招领系统的研究与实现(V4.0)
博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
DDRNet模型创新实现人像分割
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…...
try…catch…finally语句里return语句的执行顺序是怎样的?
第一种情况 try语句块里面有return语句,catch语句块和finally语句块里面没有return语句。 代码如下: public class Main {public static void main(String[] args) {System.out.println(test1());}public static int test1() {int i 10;try {System.o…...
AIGC与虚拟现实(VR)的结合与应用前景
公主请阅 引言1. AIGC与VR的基本概念1.1 AIGC简介1.2 VR技术概述 2. AIGC在VR中的应用2.1 生成虚拟环境2.2 自动生成内容2.3 互动体验 3. AIGC与VR结合的应用案例3.1 教育培训3.2 娱乐与游戏3.3 心理治疗3.4 虚拟旅游 4. AIGC与VR结合的挑战4.1 技术限制4.2 用户体验4.3 数据隐…...
如何在visual studio中 生成 并 使用dll和lib文件
因为工作需求,要写lib和dll给别人使用。 使用visual studio2022 以函数 int getmyset() { return 0;} 为例子 首先 点击打开 visual studio 文件->新建->项目 选择windows桌面向导 选择应用程序类型为动态链接库.dll 分别创建MyDLL.h和MyDLL.cpp文件&a…...
「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件
Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入,如音量调节;Progress 显示任务的完成状态,如下载进度。本文通过代码示例展示如何使用这些组件,并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更新。 关键词 Slider 组件Progress 组件节流…...
Iceoryx2:高性能进程间通信框架(中间件)
文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例(publisher.cpp)3.2 订阅者示例(subscriber.cpp) 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…...
构 造 器
我们创建了一个对象,在其中定义了属性,new一个对象,然后设置对应的属性,但是我们可以在new对象的时候,同时传入我们要设置的属性,这个时候就需要构造器。 特点 构造方法是一个特殊的成员方法,…...
草莓叶片病害识别与分类数据集(猫脸码客 第234期)
草莓叶片病害识别与分类数据集 草莓作为一种重要的经济作物,在全球范围内广泛种植。然而,草莓生产过程中常常受到各种病害的困扰,其中叶片病害尤为严重。为了有效识别、检测和分类草莓叶片病害,构建一个高质量的数据集是至关重要…...
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式(Circuit Breaker Pattern)是云计算和微服务架构中的一种保护性设计模式,其目的是避免系统中的调用链出现故障时,导致系统瘫痪。通过断路器模式ÿ…...
HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)
在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…...
lvgl 模拟器移植(V9)
1.模拟器代码下载 1.1:通过git 下载 github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux support with Wayland is work in progress.https://github.com…...
基于vue+neo4j 的中药方剂知识图谱可视化系统
前言 历时一周时间,中药大数据R02系统中药开发完毕,该系统通过scrapy工程获取中药数据,使用python pandas预处理数据生成知识图谱和其他相关数据,利用vuespringbootneo4jmysql 开发系统,具体功能请看本文介绍。 简要…...
(自用)机器学习python代码相关笔记
一些自存的机器学习函数和详细方法记录,欢迎指错。 前言:读取数据方法 import pandas as pd import pandas as pddf pd.read_csv(数据集.csv, header0) # header是从哪一行开始读起,一般是0,也可以取infer 一、数据处理&#…...
docker复现pytorch_cyclegan
1、安装docker 配置docker镜像 添加镜像源至docker engine 2、wsl2安装nvidia-docker 要在Ubuntu中安装NVIDIA Docker,需要满足以下条件: 确保主机已安装NVIDIA的CUDA驱动程序,并使用适用于您操作系统的正确版本。 wsl --update在Ubuntu…...
IDEA2024下安装kubernetes插件并配置进行使用
【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件,如果你发现自己IDEA中没有,在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下: apiVersi…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
