LeetCode[中等] 438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

思路:滑动窗口

  1. s包含p的异位词 ——> 则s.Length > p.Length;反之,s不包含p的异位词,返回空数组。
  2. s.Length >= p.Length,需要遍历 s 的每个长度为 p 长度的子字符串,判断是否存在子字符串是 p 的异位词。比较每个字符的出现次数,判断每个子字符串是否为 p 的异位词。
  3. 首先遍历 p 计算每个字符的出现次数,然后遍历 s 的首个子字符串并计算每个字符的出现次数。
  4. 每次将子字符串的下标范围向右移动一位,则有一个字符移出子字符串,有一个字符移入子字符串,更新子字符串中这两个字符的出现次数之后,比较子字符串中的每个字符的出现次数是否与 p 中的每个字符的出现次数相同。
    public class Solution {public IList<int> FindAnagrams(string s, string p) {IList<int> startIndices = new List<int>();int sLength = s.Length, pLength = p.Length;if(sLength < pLength)return startIndices;int[] sCounts = new int[26];int[] pCounts = new int[26];for(int i = 0; i < pLength; i++){char c1 = s[i];sCounts[c1 - 'a']++;char c2 = p[i];pCounts[c2 - 'a']++;}if (CheckEqual(sCounts, pCounts)) {startIndices.Add(0);}for(int i = pLength; i < sLength; i++){char prev = s[i - pLength];//上一次的窗口第一个元素sCounts[prev - 'a']--;char curr = s[i];//末尾元素sCounts[curr - 'a']++;if (CheckEqual(sCounts, pCounts)) {startIndices.Add(i - pLength + 1);}}return startIndices;}public bool CheckEqual(int[] sCounts, int[] pCounts) {for (int i = 0; i < 26; i++){if (sCounts[i] != pCounts[i]) {return false;}}return true;}
    }

    复杂度分析

  • 时间复杂度:O((m+n)×∣Σ∣),其中 m 和 n 分别是字符串 s 和 p 的长度,Σ 是字符集,这道题中 Σ 是全部小写英语字母,∣Σ∣=26。只有当 s 的长度大于等于 p 的长度时才需要遍历字符串 s 寻找 p 的异位词,需要遍历字符串 s 和 p 各一次,对于每个子字符串需要 O(∣Σ∣) 的时间判断是否为 p 的异位词。
  • 空间复杂度:O(∣Σ∣),其中 Σ 是字符集,这道题中 Σ 是全部小写英语字母,∣Σ∣=26。记录 p 和 s 中每个字母的出现次数需要 O(∣Σ∣) 的空间。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

静态住宅代理 vs 住宅代理:稳定IP有哪些优势?

在代理服务器中&#xff0c;我们通常以IP地址是否经常轮换为标准&#xff0c;将代理分为静态和住宅代理。这两种代理方式各有千秋&#xff0c;在不同的应用场景中发挥着不同的作用。但是由于场景繁多&#xff0c;用处也大有不同&#xff0c;导致很多人对于这两种代理方式并不是…

基于微信小程序的游泳馆管理系统--论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM&#xff08;Spring Spring MVC MyBatis&#xff09;&#xff0c;SSM框架web层使用Spring MVC框架&#xff0c;使传输前后端数据变得简单&#xff1b;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

C++速通LeetCode中等第5题-无重复字符的最长字串

字串substr法&#xff0c;定义字串的头部和长度&#xff0c;和字串后一位对比&#xff0c;如果不存在重复元素则长度1&#xff0c;存在重复元素则头部更新&#xff0c;长度重置。 class Solution { public:int lengthOfLongestSubstring(string s) {string s2;//存放s的前一部分…

springboot实训学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记&#xff08;3&#xff09;(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关…

【free -h内存占用】

在 free -g 命令的输出中&#xff0c;最能准确反映系统中剩余可用内存的参数是 available。这个参数考虑了缓存和缓冲的内存&#xff0c;可以更准确地反映系统的可用内存。 让我们再看一下假设的输出&#xff1a; total used free shared buff/cache av…

【PGCCC】使用 Postgres 进行数据分析的窗口函数

SQL 在处理单行数据时&#xff0c;甚至在聚合多行数据时都很有意义。但是&#xff0c;当您想比较已计算的行之间的数据时会发生什么&#xff1f;或者创建数据组并进行查询&#xff1f;输入窗口函数。 窗口函数往往会让人感到困惑 - 但它们是 SQL 中用于数据分析的非常棒的工具…

实验2 Linux文件系统常用操作实践

实验2 Linux文件系统常用操作实践 一、实验介绍 本节实验通过实战Linux文件操作模块的基本操作,需要先掌握linux文件系统的原理以及理解linux文件操作的原理,最后通过实操完成linux文件操作的命令,其中包括改变目录、创建目录及文件、删除文件、复制文件、文件移动和改名、查…

【大模型入门】零基础入门AI大模型应用开发,你需要一个系统的入门路径!

随着大模型技术的飞速发展&#xff0c;我们正站在一个全新的技术前沿&#xff0c;探索着如何将这些强大的工具应用于实际问题的解决。如果你对AI大模型应用开发充满热情&#xff0c;那么你可以读一下这篇文章——一个系统全面的入门指南&#xff0c;专为渴望深入AI世界的你设计…

Windows 系统管理

1 安装 Windows Server 2016 操作系统的硬件最低需求&#xff1f; 处理器 1.4GHz 64 位处理器 RAM 512MB&#xff08;带桌面体验 2GB&#xff09; 磁盘空间 32GB 2 Windows Server 2016 操作系统的常见版本&#xff1f; Windows Server 2016 Standard&#xff08; 标 准 版 &a…

【新手必看】SpringBoot集成Minio实现文件上传、下载和删除

一&#xff0c;前言 安装教程可看我以前的文章&#xff0c;Linux和Windows安装教程都有。安装好minio后今天学习minio的使用。 二&#xff0c;集成Minio 1&#xff0c;导入依赖&#xff0c;版本可自己选择 <!-- https://mvnrepository.com/artifact/io.minio/minio -->…

LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,2424. 最长上传前缀

947. 移除最多的同行或同列石头 题目描述 947. 移除最多的同行或同列石头 n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。 如果一块石头的 同行或者同列 上有其他石头存在&#xff0c;那么就可以移除这块石头。 给你一个长度为 n 的数组 …

[Golang] Select

[Golang] Select 文章目录 [Golang] Select什么是selectselect用法基本用法空select没有default且case永久无法执行单个case和default多个case和default IO多路复用 什么是select select是Golang中一个控制结构&#xff0c;可以用来处理多个channel的发送和接收操作。select会…

Echats 实现CPK (过程能力)研究报告

背景: 实现: Echarts Option 代码示例 option {title: {text: 折线图示例 - X轴为数值},xAxis: {type: value, // X 轴改为数值型min: 0, // 最小值max: 10, // 最大值},yAxis: {type: value},series: [{type: line,data: [[0, 150], [2, 230], [4, 224], [6…

Photoshop 2021安装教程

软件介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是美国Adobe公司旗下最为出名的图像处理软件系列之一。ps 2021新增一键换天空&#xff0c;AI只能滤镜&#xff0c;新增内置的画笔工具极为丰富&#xff0c;成千上万的精致像素、动态和矢量画笔可以满足你的各种绘图…

论文阅读--Planning-oriented Autonomous Driving(二)

自动驾驶框架的各种设计比较。 ( a )大多数工业解决方案针对不同的任务部署不同的模型。 ( b )多任务学习方案共享一个具有分割任务头的主干。 ( c )端到端范式将感知和预测模块统一起来。以往的尝试要么采用( c.1 )中对规划的直接优化&#xff0c;要么采用( c.2 )中的部分元…

【结构型】树形结构的应用王者,组合模式

目录 一、组合模式1、组合模式是什么&#xff1f;2、组合模式的主要参与者&#xff1a; 二、优化案例&#xff1a;文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点&#xff1a; 三、使用组合模式有哪些优势1、统一接口&#xff0c;简化客户端代码2、递归结构处理方…

选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容&#xff08;Matlab&#xff09; 问题建模&#xff1a;首先&#xff0c;需要将电动汽车充电站选址与定容问题进行数学建模&#xff0c;确定目标函数和约束…

Redis面试真题总结(一)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 什么是Redis? Redis是一个高性能的开源内存数据库系统&#xff0…

Java从入门到精通学习框架(三)

这一阶段的学习目标是将 Java 的知识从基础提升到实战开发的应用层面&#xff0c;通过对常见的 Java 企业级开发框架的学习和实践&#xff0c;掌握设计模式、分布式系统开发、性能优化等核心技能。在此基础上&#xff0c;学习并应用 Java 的高级特性和最佳实践&#xff0c;使自…

C#和数据库高级:抽象类和抽象方法

文章目录 一、为什么使用抽象类和抽象方法&#xff1f;1.1、父类与子类的相互转换 二、抽象类和抽象方法2.1、抽象类的定义和方法声明规范2.2、使用继承多态的机制解决问题 三、抽象类的概念和使用特点总结 一、为什么使用抽象类和抽象方法&#xff1f; 1.1、父类与子类的相互…