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

Java实现 LeetCode 438 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。 说明: 字母异位词指字母相同,但排列不同的字符串。 不考虑答案输出的顺序。 示例 1: 输入: s: “cbaebabacd” p: “abc” 输出: [0, 6] 解... 阅读详情

Every day a leetcode

题目来源:438. 找到字符串中所有字母异位词

解法:滑动窗口+hash

异位词 指由相同字母重排列形成的字符串(包括相同的字符串),其特点为hash表完全一致。

建立两个hash表,hash_p统计p,hash_window统计滑动窗口。

滑动窗口大小windowSize=p的长度。

窗口从s的第一个字符开始, 直到移动至s的末尾。

对每个滑动窗口更新hash_window,再与hash_p匹配,若完全一致,说明当前窗口的字符串是一个异位词,在ans动态数组内增加当前下标;若不一致,窗口右移一位。

函数isMatch()判断hash_p和hash_window是否完全一致。

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 #define MAX_HASH_LENGTH 26

//判断hash_p与hash_window是否一致
bool isMatch(int *hash_p,int *hash_window)
{
    for(int i=0;i<MAX_HASH_LENGTH;i++)
    {
        if(hash_p[i]!=hash_window[i]) return false;
    }
    return true;
}

int* findAnagrams(char * s, char * p, int* returnSize){
    int s_length=strlen(s);
    int p_length=strlen(p);
    int windowSize=p_length;
    *returnSize=0;
    int *ans;
    ans=(int*)malloc(s_length*sizeof(int));

    if(s_length<p_length) return ans;

    int hash_p[MAX_HASH_LENGTH];
    int hash_window[MAX_HASH_LENGTH];
    memset(hash_p,0,sizeof(hash_p));
    memset(hash_window,0,sizeof(hash_window));
    //求p的hash表hash_p
    for(int i=0;i<p_length;i++) hash_p[p[i]-'a']++;
    //开滑
    for(int i=0;i<=s_length-windowSize;i++)
    {
        //先将hash_window还原
        memset(hash_window,0,sizeof(hash_window));
        //求当前滑动窗口的hash表hash_window
        for(int j=0;j<windowSize;j++) hash_window[s[i+j]-'a']++;
        //若hash_p与hash_window一致,ans数组记录当前下标
        if(isMatch(hash_p,hash_window)) ans[*returnSize++]=i;
    }
    return ans;
}

结果:
在这里插入图片描述
看起来,运算次数过大,栈爆了…

优化

问题出在对每个滑动窗口都从新开始求hash_window,我们只需要删掉旧窗口开头的hash值,增加新窗口结尾的hash值,即可得到新窗口的hash_window。

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();

        if (sLen < pLen) {
            return vector<int>();
        }

        vector<int> ans;
        vector<int> sCount(26);
        vector<int> pCount(26);
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if (sCount == pCount) {
            ans.emplace_back(0);
        }

        for (int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];

            if (sCount == pCount) {
                ans.emplace_back(i + 1);
            }
        }

        return ans;
    }
};

结果:
在这里插入图片描述

从7V到28V宽压输入,手把手教你设计一个5V/3A的DCDC电源模块(附MPS1584选型与原理图避坑) 本文详细解析了基于MPS1584芯片的7V至28V宽压输入到5V/3A输出的DCDC电源模块设计全流程。从电源架构选择、原理图设计要点到实际调试经验,涵盖了输入保护电路、功率转换核心电路及系统级优化测试,帮助工程师规避常见设计陷阱,实现高效稳定的电源解决方案。 阅读详情

相关推荐

SFR算法实现详解:从边缘检测到MTF计算的完整流程

本文详细解析了SFR算法从边缘检测到MTF计算的完整流程,包括边缘检测、ESF超采样、LSF差分等关键步骤。通过代码示例和实战经验,帮助开发者高效实现成像系统解析力评估,优化MTF测量精度。适用于摄像头模组调试、工业检测等场景。

Black的专栏 1010

LeetCode 438_找到字符串中所有字母异位词 c++本地实现(超详细)

论文写不出来,先做个题吧,本文用了暴力解法和滑动窗口法。前边两篇说的比较详细了,可以参考下。 LeetCode 49_字母异位词分组 c++本地实现(超详细)_好人好事代表nxx的博客-优快云博客 哈希表通俗解释,leetcode_242字母异位词,c++本地实现(超详细)_好人好事代表nxx的博客-优快云博客 1.题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相.

qq_40286920的博客 552

保姆级教程:用杰理701N可视化SDK搞定ANC降噪配置(从工具到代码全流程)

本文提供了一份详细的杰理701N可视化SDK配置ANC降噪功能的教程,涵盖从开发环境搭建到代码集成的全流程。通过图形化工具和代码示例,帮助开发者快速掌握ANC参数配置技巧,优化降噪效果,解决常见问题。

weixin_30616969的博客 452

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

438. 找到字符串中所有字母异位词 题号:力扣438 知识点:字符串,滚动窗口 目标完成度:59/150 总结 题干: 思路: 1.如果s的长度小于p,则s中必然找不到与p是异位词的子串。 2.异位词的特点是每个字母出现的次数一直,但是出现的顺序不一定相同。因此我们建立两个容器,来记录p中和滚动窗口中每个字母出现的次数,由于字母一共只有26个,所以容易大小为26。 3.第一个for循环相当于是对scount进行初始化,同时统计p中每个字母出现的次数。 4.第二个for循环是滚动窗口,窗口的长度为p

weixin_44742084的博客 361

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6203

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

[力扣c++实现] 438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词 难度中等727 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。 示例 2: 输入: s =

dengwodaer的博客 335

Godot 2D游戏开发实战:用GDScript复刻10款经典小游戏(附完整源码)

本文是一份Godot 2D游戏开发实战指南,通过使用GDScript语言复刻10款经典小游戏,帮助开发者快速掌握引擎核心功能。内容涵盖从环境配置、GDScript基础到贪吃蛇、Flappy Bird、打砖块、俄罗斯方块等项目的核心逻辑与代码实现,并附有完整源码,旨在通过实践提升独立开发能力。

gold的博客 779

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

起始索引等于0的子串是"cba",它是"abc"的异位词。起始索引等于6的子串是"bac",它是"abc"的异位词。起始索引等于0的子串是"ab",它是"ab"的异位词。起始索引等于1的子串是"ba",它是"ab"的异位词。起始索引等于2的子串是"ab",它是"ab"的异位词。输入s="cbaebabacd",p="abc"输入s="abab",p="ab"采用滑动窗口方法(定长的滑动窗口)输出[0,1,2]......

weixin_50437588的博客 477

【定位模块项目实战】gnss_localizer、lidar_localizer功能包解析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、1.2.3.4.二、1.2.3.4.三、1.2.3.4.四、1.2.3.4.总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对**【无人驾驶autoware项目实战】感知–定位模块**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、 1. 2. 3. 4. . . 二、

qq_35635374的博客 1931

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2351

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

题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。 示例 2: 输入: s = "abab", p = "ab" 输出: [0,

阳光大男孩!!!的博客 568

SCADA|测试KingSCADA4.0信创版采集汇川PLC AC810数据

摘要:雷工分享KingSCADA4.0信创版采集汇川PLC数据的配置过程。由于项目繁忙,笔记更新延迟。信创产业要求采用国产化产品,此次通过ModbusTCP协议连接AC810 PLC。主要步骤包括:新建IOServer应用(需厂家协助从3.8升级至4.0)、安装ModbusTCP驱动、配置设备地址(192.168.1.88:5021)、运行IOServer并通过网页监控变量。尽管信创版操作体验较差,但出于国产化战略需要仍需使用。雷工表示理解产品初期不足,相信未来会逐步优化。2025年4月11日记录于四川绵阳

做有价值的事,积累有价值的笔记! 865

golang力扣leetcode 438.找到字符串中所有字母异位词

438.找到字符串中所有字母异位词438.找到字符串中所有字母异位词题解代码 438.找到字符串中所有字母异位词 438.找到字符串中所有字母异位词 题解 大水题 代码 package main func findAnagrams(s string, p string) []int { var result []int wind := make(map[byte]int) need := make(map[byte]int) for i := range p { need[p[i]]++ }

清风 613

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

力扣解题-438. 找到字符串中所有字母异位词

第一次解答的“排序对比”思路逻辑直观,但排序带来的O(m×logm)开销导致时间复杂度极高,仅适用于极小数据量,无法满足题目要求;第二次解答的“字符计数”思路是本题的最优解:利用异位词的字符频次特性,用固定长度的数组替代排序,将时间复杂度优化至O(n),是“空间换时间”的经典应用;放弃“排序后对比”的直观思路,转而利用“字符频次相等”的本质特征,通过高效的计数操作替代高开销的排序操作。

qq_38261626的博客 982

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

力扣438-找到字符串中所有字母异位词

力扣438-找到字符串中所有字母异位词 滑动窗口解法

ccf19881030的专栏 665

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

初始时,res 是空列表,cnt_p 是 {'a': 1, 'b': 1},cnt_s 是空计数器。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。不考虑答案输出的顺序。输入: s = "abab", p = "ab"

q1111111da的博客 415

力扣每日一题:438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词 https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ 题目: 给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。 字符串只包含小写英文字母,并且字符串s和 p的长度都不超过 20100。 说明: 字母异位词指字母相同,但排列不同的字符串。...

清风Python 283

LeetCode438 找到字符串中所有字母异位词

LeetCode438 找到字符串中所有字母异位词题目解题:滑动窗口 + 双指针 题目 解题:滑动窗口 + 双指针 LeetCode76 最小覆盖子串 同样使用滑动窗口 + 双指针来解题。下面一版的代码也与其类似,两道问题的不同之处在于:76题返回的最短字符串里面包含 p 的异位词,长度可以比 p 长,可以包含 p 以外的字母等,只要从中选取的一组字符可以构成 p 的异位词就成。 438题找的是异位词,长度和每个字符的个数都要相同。 sFreq 只记录在 p 中出现的字符的频数。 从提交结果来看,用数组来

348

【算法笔记】力扣热题100(LeetCode hot-100)438. 找到字符串中所有字母异位词 滑动窗口

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串。使用滑动窗口解决问题。滑动窗口就是指定一个大小作为窗口,然后在字符串上滑动这个窗口,找到符合条件的子串。异位词换句话说就是:两个字符串的字符相同,但排列顺序不一定相同的字符串。

不想当吗喽的博客 551

找到字符串中所有字母异位词LeetCode第438题

给定两个字符串s和p,找到s中所有p的的起始索引。

qq_58349936的博客 738

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

上述算法通过固定窗口大小和数组统计,能高效处理这种情况,避免了频繁哈希表操作的开销。每次滑动窗口只需 O(1) 时间更新频率并比较数组,因此即使字符串很长,也能快速找到所有异位词位置。来高效判断子串是否为异位词。这个解题思路的核心是利用。

weixin_45524582的博客 784

leetcode438:找到字符串中所有字母异位词-----滑动窗口实现

                      leetcode438:找到字符串中所有字母异位词 文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍 import java.util.ArrayList; import java.util.Arrays; import java.util.List; publi...

weixin_42248302的博客 1210

【Leetcode hot 100】438.找到字符串中所有字母异位词

本文介绍了如何在一个字符串 s 中查找所有与字符串 p 构成字母异位词的子串,并返回这些子串的起始索引。字母异位词是指字符相同但顺序不同的字符串。 方法思路: 滑动窗口法:通过维护一个与 p 长度相同的滑动窗口,统计窗口内字符的频率。 字符频率比较:初始化时统计 p 的字符频率,并在 s 中滑动窗口,每次移动窗口时更新字符频率,检查是否与 p 的频率一致。 解决代码: 使用两个长度为26的数组分别统计 p 和当前窗口的字符频率。 初始窗口检查后,滑动窗口遍历字符串 s,动态更新窗口字符频率并比较。 辅助方法

专注Java和MySQL领域知识分享 1062

leetcode 438:找到字符串中所有字母异位词

leetcode 438:找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异

yingmu__的博客 472

Day19-leetcode438. 找到字符串中所有字母异位词

c++打卡学习 每日写编程题,题解,总结

m0_47546822的博客 357
上一篇: Leetcode1748. 唯一元素的和
下一篇: Leetcode1175. 质数排列
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值