news 2026/6/21 18:35:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 438.找到字符串中所有字母异位词

思路:滑动窗口。

对于主串s和子串p,设n是子串p的长度。

一、方法一:定长滑动窗口。枚举主串s的所有长为n的子串s',在滑动的同时维护s’中的每种字母的出现次数。如果s'的每种字母的出现次数和p的每种字母的出现次数都相同,那么s'是p的异位词,并把s'的左端点下标加入答案。

附代码:

class Solution { public List<Integer> findAnagrams(String s, String p) { //统计p的每种字母的出现次数 int[] cntp = new int[26]; for(char c : p.toCharArray()){ cntp[c - 'a']++; //统计p的字母 } List<Integer> res = new ArrayList<>(); int[] cnts = new int[26]; //统计s的长度为p.length()的子串s'的每种字母的出现次数 for(int right = 0;right < s.length();right++){ cnts[s.charAt(right) - 'a']++; //右端点字母进入窗口 int left = right - p.length() + 1; if(left < 0){ //窗口长度不足p.length() continue; } if(Arrays.equals(cnts,cntp)){ //s'和p的每种字母的出现次数都相同 res.add(left); //s'的左端点下标加入答案 } cnts[s.charAt(left) - 'a']--; //左端点字母离开窗口 } return res; } }

二、方法二:不定长滑动窗口。枚举子串s'的右端点,如果发现s’其中一种字母的出现次数大于p的这种字母的出现次数,则右移s'的左端点(缩小窗口)。如果发现s'的长度等于p的长度,则说明s'的每种字母的出现次数等于p的每种字母的出现次数,即s'是p的异位词。

证明:内层循环结束后,s'的每种字母的出现次数都小于等于p的每种字母的出现次数。如果s’的其中一种字母的出现次数比p的小,那么s'的长度必然小于p的长度。所以只要s'的长度等于p的长度,就说明s'的每种字母的出现次数和p的每种字母的出现次数都相同,就说明s'是p的异位词,于是把s'的左端点下标加入答案。

代码实现时,可以把cnts和cntp合并成一个cnt:

(1)对于p的字母c,把cnt[c]加一。

(2)对于s的字母c,把cnt[c]减一。

(3)如果cnt[c]小于0,则说明窗口中的字母c的个数比p的多,右移左端点。

附代码:

class Solution { public List<Integer> findAnagrams(String s, String p) { //统计p的每种字母的出现次数 int[] cnt = new int[26]; for(char c : p.toCharArray()){ cnt[c - 'a']++; } List<Integer> res = new ArrayList<>(); int left = 0; for(int right = 0;right < s.length();right++){ int c = s.charAt(right) - 'a'; cnt[c]--; //右端点字母进入窗口 while(cnt[c] < 0){ //字母c太多了 cnt[s.charAt(left) - 'a']++; //左端点字母离开窗口 left++; } if(right - left + 1 == p.length()){ //s'和p的每种字母的出现次数都相同 res.add(left); //s'的左端点下标加入答案 } } return res; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 0:47:00

RabbitMQ 集群常见“坑”全攻略:从根本原因到救命排查技巧

RabbitMQ 集群常见“坑”全攻略:从根本原因到救命排查技巧 RabbitMQ 集群是保障消息队列 高可用 和 高性能 的核心架构,但在实际部署和运维过程中,往往会踩到各种“坑”。 本文将系统梳理这些常见问题、根本原因,并总结关键的排查和修复技巧,帮助你在生产环境中更好地稳定…

作者头像 李华
网站建设 2026/6/20 8:18:03

Windows找不到d3dx9_31.dll文件 无法启动游戏软件 彻底修复解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/19 14:35:02

别再无脑敲 grep 了,我靠这 5 个选项,定位问题速度提升 10 倍

在日常运维工作中,我们几乎每天都在和日志、配置文件、代码片段打交道。 日志动辄几十 GB,配置文件成百上千行,出问题时,时间永远是最宝贵的资源。 很多同事都会用 grep,但90% 的人只会用最基础的 grep “keyword” file。 结果就是: 要么匹配不准 要么结果一大堆 要么漏…

作者头像 李华
网站建设 2026/6/17 16:37:07

手机端AIDE编译器安卓朗读器软件代码

java代码package com.ld.app; /*手机编程王APP & AIDE编译器联合出品官方微信2133688724微信公众号&#xff1a;手机编程APP官网&#xff1a;www.shoujibiancheng.com */import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.speech.…

作者头像 李华
网站建设 2026/6/18 23:41:56

【Linux系统】进程终止、进程等待与进程替换的概念与实现

代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码异常终止&#xff08;被信号终止了&#xff09;而进程执行的结果状态&#xff0c;可以用两个数字表示出来&#xff0c;即退出码和终止信号&#xff1a;int exit_code, int exit_signal&#xff1a;当代…

作者头像 李华
网站建设 2026/6/20 0:23:20

第六十三篇-ComfyUI+V100-32G+代码-Z-Image-Turbo

环境 系统&#xff1a;CentOS-7 CPU : E5-2680V4 14核28线程 内存&#xff1a;DDR4 2133 32G * 2 显卡&#xff1a;Tesla V100-32G【PG503】 (水冷) 驱动: 535 CUDA: 12.2 ComfyUI version: 0.4.0 ComfyUI frontend version: 1.34.8系统软件信息 系统信息 OS linux Python Vers…

作者头像 李华