LeetCode 438. 找到字符串中所有字母异位词 | 滑动窗口与字符计数数组解法

文章目录

    • 问题描述
    • 核心思路:滑动窗口 + 字符计数数组
      • 1. 字符计数数组
      • 2. 滑动窗口
    • 算法步骤
    • 完整代码实现
    • 复杂度分析
    • 关键点总结
    • 类似问题

问题描述

给定两个字符串 sp,要求找到 s 中所有是 p 的**字母异位词(Anagram)**的子串的起始索引。
字母异位词是指由相同字母重新排列形成的字符串(包含相同的字母且每个字母出现的次数相同)。
例如:

  • 输入:s = "cbaebabacd", p = "abc"
    输出:[0, 6]
    解释:s 中从索引 0 开始的 "cba" 和索引 6 开始的 "bac" 均为 "abc" 的异位词。

核心思路:滑动窗口 + 字符计数数组

1. 字符计数数组

  • 核心思想:通过固定长度的数组(长度26,对应26个小写字母)记录字符串中每个字符的出现次数。
  • 比较机制:若两个字符串的字符计数数组相同,则它们是字母异位词。

2. 滑动窗口

  • 窗口初始化:在 s 中初始化一个长度为 p.length() 的窗口。
  • 窗口滑动:每次向右移动窗口,移除左边界字符的计数,增加右边界字符的计数。
  • 实时比较:每次滑动后检查当前窗口的计数数组是否与 p 的计数数组一致。

算法步骤

  1. 边界处理:若 s 的长度小于 pp 为空,直接返回空列表。
  2. 初始化计数数组
    • pCount:统计 p 中每个字符的出现次数。
    • sCount:统计 s 中初始窗口(前 p.length() 个字符)的出现次数。
  3. 初始窗口检查:若初始窗口的计数与 p 一致,记录索引 0
  4. 滑动窗口遍历
    • 窗口每次右移一位,更新左边界字符的计数(减少)和右边界字符的计数(增加)。
    • 每次更新后检查计数数组是否匹配,若匹配则记录当前窗口的起始索引。

完整代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> result = new ArrayList<>();int m = p.length();int n = s.length();// 边界条件处理if (m == 0 || n < m) {return result;}int[] pCount = new int[26]; // 记录p的字符计数int[] sCount = new int[26]; // 记录当前窗口的字符计数// 初始化p和s的初始窗口的字符计数for (int i = 0; i < m; i++) {pCount[p.charAt(i) - 'a']++;sCount[s.charAt(i) - 'a']++;}// 检查初始窗口是否匹配if (Arrays.equals(pCount, sCount)) {result.add(0);}// 滑动窗口:每次移动一位,更新sCount并检查for (int i = 1; i <= n - m; i++) {// 移除左边界字符的计数int leftChar = s.charAt(i - 1);sCount[leftChar - 'a']--;// 添加右边界字符的计数int rightChar = s.charAt(i + m - 1);sCount[rightChar - 'a']++;// 检查当前窗口是否匹配if (Arrays.equals(pCount, sCount)) {result.add(i);}}return result;}
}

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串 s 的长度。
    滑动窗口遍历 s 需要 O(n),每次窗口操作(更新计数和比较)的时间为常数。
  • 空间复杂度O(1),使用固定长度的两个长度为26的数组。

关键点总结

  1. 字符计数数组:利用数组索引映射字符,快速统计字符出现次数。
  2. 滑动窗口优化:避免每次重新计算整个子串的计数,通过动态更新窗口边界字符的计数保证高效性。
  3. 边界处理:注意字符串长度不足时的直接返回逻辑。

类似问题

  • LeetCode 567. 字符串的排列:判断 s2 是否包含 s1 的排列。
  • LeetCode 76. 最小覆盖子串:寻找覆盖目标字符的最短子串。

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

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

相关文章

idea中,git的cherry-pick怎么用

背景: A同学在A分支进行开发, B同学在B分支进行开发,B同学开发过程中发现,A同学在A分支上面的某次提交,例如某次提交了一个工具类,B同学也用的到这个工具类,但是B又不想mergeA分支的代码,此时就可以用到git的chery pick能力.

深入解析:如何基于开源OpENer开发EtherNet/IP从站服务

一、EtherNet/IP协议概述 EtherNet/IP(Industrial Protocol)是一种基于以太网的工业自动化通信协议,它将CIP(Common Industrial Protocol)封装在标准以太网帧中,通过TCP/IP和UDP/IP实现工业设备间的通信。作为ODVA(Open DeviceNet Vendors Association)组织的核心协议…

当 PyIceberg 和 DuckDB 遇见 AWS S3 Tables:打造 Serverless 数据湖“开源梦幻组合”

引言 在一些大数据分析场景比如电商大数据营销中&#xff0c;我们需要快速分析存储海量用户行为数据&#xff08;如浏览、加购、下单&#xff09;&#xff0c;以进行用户行为分析&#xff0c;优化营销策略。传统方法依赖 Spark/Presto 集群或 Redshift 查询 S3 上的 Parquet/O…

流复备机断档处理

文章目录 环境症状问题原因解决方案 环境 系统平台&#xff1a;UOS&#xff08;海光&#xff09;,UOS &#xff08;飞腾&#xff09;,UOS&#xff08;鲲鹏&#xff09;,UOS&#xff08;龙芯&#xff09;,UOS &#xff08;申威&#xff09;,银河麒麟svs&#xff08;X86_64&…

【蓝桥杯真题精讲】第 16 届 Python A 组(省赛)

文章目录 T1 偏蓝 (5/5)T2 IPv6 (0/5)T3 2025 图形 (10/10)T4 最大数字 (10/10)T5 倒水 (15/15)T6 拼好数 (0/15)T7 登山 (20/20)T8 原料采购 (20/20) 更好的阅读体验 高速访问&#xff1a;https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久链接&#xff1…

SpringBoot+Dubbo+Zookeeper实现分布式系统步骤

SpringBootDubboZookeeper实现分布式系统 一、分布式系统通俗解释二、环境准备&#xff08;详细版&#xff09;1. 软件版本2. 安装Zookeeper&#xff08;单机模式&#xff09; 三、完整项目结构&#xff08;带详细注释&#xff09;四、手把手代码实现步骤1&#xff1a;创建父工…

Spring的业务层,持久层,控制层的关系

在 Spring 框架中&#xff0c;控制层&#xff08;Controller&#xff09;、业务层&#xff08;Service&#xff09; 和 持久层&#xff08;Repository/Mapper&#xff09; 是分层架构的核心组成部分&#xff0c;职责分离明确&#xff0c;通过依赖注入&#xff08;DI&#xff09…

css实现不确定内容的高度过渡

实现效果&#xff1a;鼠标悬浮按钮&#xff0c;高度过渡出现如图所示文本框 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

计算机视觉与深度学习 | matlab实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据)

以下是一个基于MATLAB的ARIMA-WOA-CNN-LSTM时间序列预测框架。由于完整代码较长,此处提供核心模块和实现思路,完整源码和数据可通过文末方式获取。 1. 数据准备(示例数据) 使用MATLAB内置的航空乘客数据集: % 加载数据 data = readtable(airline-passengers.csv); data …

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…

Sql刷题日志(day9)

一、笔试 1、limit offset&#xff1a;分页查询 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳过前 start_row 行&#xff0c;返回接下来的 number_of_rows 行。 2、lag、lead&#xff1a;查询前后行数据 --lag函数用于访问当…

C++面试3——const关键字的核心概念、典型场景和易错陷阱

const关键字的核心概念、典型场景和易错陷阱 一、const本质&#xff1a;类型系统的守护者 1. 与#define的本质差异 维度#defineconst编译阶段预处理替换编译器类型检查作用域无作用域&#xff08;全局污染&#xff09;遵循块作用域调试可见性符号消失保留符号信息类型安全无类…

16-看门狗和RTC

一、独立看门狗 1、独立看门狗概述 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff08;不按照正常程序进行运行&#xff0c;如程序重启&#xff0c;但是如果我们填加看门狗的技术&#xff0…

w~自动驾驶~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…

怎么打包发布到npm?——从零到一的详细指南

怎么打包发布到npm&#xff1f;——从零到一的详细指南 目录 怎么打包发布到npm&#xff1f;——从零到一的详细指南一、准备工作1. 注册 npm 账号2. 安装 Node.js 和 npm 二、初始化项目三、编写你的代码四、配置 package.json五、打包你的项目六、登录 npm七、发布到 npm八、…

【C++ - 仿mudou库one thread one loop式高并发服务器实现】

文章目录 项目介绍项目模块和服务器主要设计模式项目主要流程前置知识1.bind函数2.定时器任务TimerTask和时间轮思想TimerWheel3.正则表达式4.通用型容器Any类 服务器设计模式1&#xff09;单Reactor单线程模式2&#xff09;单Reactor多线程模式3&#xff09;多Reactor多线程模…

RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro USB 测试&#xff08;3.0 U盘&#xff0c;2.0 UVC摄像头&#xff09; 总共开发板有4个USB的A口&#xff0c;1个USB的TypeC口&#xff0c;我们插上两个USB3.0的U盘和一个USB2.0的UVC摄像头来进行测试 lsusb -tv 可以看到有3个US…

docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)

文章目录 前言引入docker 简介docker的应用场景docker的虚拟化技术VS虚拟机docker的优点docker架构Docker仓库Docker镜像linux操作系统的大致组成部分 Docker容器 docker安装与启动校验版本移除旧的版本安装依赖工具设置软件源安装docker验证 配置镜像加速器docker服务相关命令…

记录一次服务器卡顿

一、服务器卡顿现象 服务用了一段时间后&#xff0c;突然很卡&#xff0c;发现在服务器上新建excel也很卡&#xff0c;发现服务器中病毒了&#xff0c;然后重新安装了操作系统。重新安装服务环境时&#xff0c;发现同时安装pdf、tomcat时都很慢&#xff0c;只能一个安装好了&am…

基于 Reactor 的 Java 高性能异步编程:响应式流与背压详解

本文将围绕 Reactor 框架&#xff0c;深入剖析响应式流的核心机制&#xff0c;重点讲解背压&#xff08;Backpressure&#xff09;的实现原理与实际应用。通过理论结合实践&#xff0c;希望帮助你真正掌握 Java 世界的响应式异步编程。 一、响应式编程与 Reactor 简介 1.1 什么…