【哈希-中等】438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词 的字母异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。字母异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。本题可通过滑动窗口的方法来解决。维护一个大小与字符串。上滑动该窗口,检查窗口内的子串是否为。长度相同的滑动窗口,在字符串。 阅读详情

【题目】
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
【示例 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” 的字母异位词。
【代码】
【Python】
在这里插入图片描述
这个评判系统也是蛮神奇的,昨天还可以通过,今天就是超时了。。。

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        s+=","
        p="".join(sorted(list(p)))
        pos=0
        ans=[]
        for index,c in enumerate(s):
            if index-pos==len(p):
                if "".join(sorted(list(s[pos:index])))==p:
                    ans.append(pos)
                pos+=1
        return ans

【滑动窗口+数组】
在这里插入图片描述

  1. 因为字符串中的字符全是小写字母,可以用长度为26的数组记录字母出现的次数
    设n = len(s), m = len§。
  2. 记录p字符串的字母频次p_cnt,和s字符串前m个字母频次s_cnt
  3. 若p_cnt和s_cnt相等,则找到第一个异位词索引 0
  4. 继续遍历s字符串索引为[m, n)的字母,在s_cnt中每次增加一个新字母,去除一个旧字母
  5. 判断p_cnt和s_cnt是否相等,相等则在返回值res中新增异位词索引 i - m + 1
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        len_s,len_p,ans,p_cnt,s_cnt=len(s),len(p),[],[0]*26,[0]*26
        if len_s<len_p:
            return ans
        for i in range(len_p):
            p_cnt[ord(p[i])-ord('a')]+=1
            s_cnt[ord(s[i])-ord('a')]+=1
        if p_cnt==s_cnt:
            ans.append(0)
        for i in range(len_p,len_s):
            s_cnt[ord(s[i])-ord('a')]+=1
            s_cnt[ord(s[i-len_p])-ord('a')]-=1
            if s_cnt==p_cnt:
                ans.append(i-len_p+1)
        return ans

【滑动窗口+双指针】
在这里插入图片描述

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        n, m, res = len(s), len(p), []
        if n < m: return res
        p_cnt = [0] * 26
        s_cnt = [0] * 26

        for i in range(m):
            p_cnt[ord(p[i]) - ord('a')] += 1
        
        left = 0
        for right in range(n):
            cur_right = ord(s[right]) - ord('a')
            s_cnt[cur_right] += 1
            while s_cnt[cur_right] > p_cnt[cur_right]:
                cur_left = ord(s[left]) - ord('a')
                s_cnt[cur_left] -= 1
                left += 1
            if right - left + 1 == m:
                res.append(left)
        return res
unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」 水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv... 阅读详情

相关推荐

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

Linux用户成功在LinuxMint22.1系统上通过Wine9.0运行同花顺远航版,解决了长期困扰的股票行情软件问题。此前Linux原生版同花顺功能简陋且停止更新,Wine版通达信存在显示问题。作者作为自由软件支持者,通过调整Wine配置文件解决了高分屏显示异常问题,实现了远航版的正常使用。期待同花顺能重启Linux原生版开发,支持更多处理器架构,完善国产软件生态。该方案为Linux股票软件用户提供了实用参考。

5147

LeetCode 438. 找到字符串中所有字母异位词 Java实现

通过使用双指针,我们可以有效地解决这个问题。在实现过程中,需要注意窗口的扩展和收缩逻辑,以及如何判断当前窗口是否包含p的所有字符。这个问题不仅考察了对字符串操作的理解,还考察了双指针技巧的应用。希望这篇技术博客能够帮助你更好地理解和解决438. 找到字符串中所有字母异位词”这个问题。

Lentr0py的博客 601

Qt跨平台CAN通信实战:Vector、PCAN与周立功设备统一接口设计

本文针对Qt开发中常见的多品牌CAN设备兼容难题,提出了一套统一的跨平台CAN通信接口设计方案。通过抽象层封装,实现了对Vector、PCAN和周立功设备的统一操作,上层业务代码无需修改即可在不同硬件间切换,有效解决了驱动API差异、环境配置复杂和维护成本高等痛点,显著提升了代码复用率和开发效率。

weixin_29161785的博客 333

【优选算法】滑动窗口——leetcode——438.找到字符串中所有字母异位词

STL(Standard Template Library): 向量 vector 是 STL 的一部分,提供动态数组的功能。 范围 for 循环: C++11 引入的循环方式,简化了遍历操作。 字符数组与频率统计: 使用数组来记录字符出现的频率,并进行简单的数学运算实现高效统计。 双指针(Sliding Window)技巧: 通过两个指针控制一个窗口,用于高效地处理子串问题。 成员函数与类: 通过类和成员函数组织代码,方便管理和调用。

小李很执着的博客 1892

Unity3d 编译发布到安卓平台时出现的问题集

环境搭建好了,android SDK也有了,但导出的时候提示Error building Player: Win32Exception: ApplicationName='java.exe'....... 国内好像没看到解决方法。在Unity3d的论坛里面看到一个解决方法,把C:\windows\system32\java.exe复制到C:\Windows\SysWOW64里面,我这里就解决

erictang01的专栏 1775

隐语第四课:快速上手-SecretFlow的安装和部署

隐语课程,继续学习隐私计算技术

weixin_41467180的博客 2509

找到字符串中所有字母异位词、串联所有单词的子串

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

2301_76161469的博客 1047

告别视频广告:OpenWrt下luci-app-adbyby plus/lite的完整配置与避坑手册

本文详细介绍了在OpenWrt路由器上配置Adbyby Plus/Lite广告屏蔽工具的完整流程与优化方案。从环境准备、规则文件手动配置到高级性能调优,帮助用户有效拦截视频前贴片广告和弹窗广告,提升家庭网络浏览体验。特别针对官方源停止维护的问题,提供了实用的规则更新解决方案。

weixin_29306011的博客 745

专题二 - 滑动窗口 - leetcode 438. 找到字符串中所有字母异位词 | 中等难度

专题二 - 滑动窗口 - 哈希表 - 字符串判断优化

分享简单技术,记录点滴成长 894

用MATLAB计算卡方值

然后,我们计算了期望频数,即在两个分类变量独立的情况下,每个单元格的预期频数。接下来,我们使用卡方检验的公式计算了卡方值。卡方检验是一种常用的统计方法,用于确定两个分类变量之间是否存在相关性。它基于观察到的频数和期望频数之间的差异来评估分类变量之间的独立性。在MATLAB中,我们可以使用。请注意,这只是一个简单的示例代码,用于说明如何使用MATLAB计算卡方值。在实际应用中,您可能需要根据您的具体数据和研究问题进行相应的修改和调整。在上面的代码中,我们首先创建了两个分类变量。函数显示了计算得到的卡方值。

CodeNexus的博客 2659

【YoloV11改进策略】基于流形约束超连接(mHC)增强YoloV11全局特征提取能力|独家复现|梁文峰署名论文

论文标题:流形约束超连接 (Manifold-Constrained Hyper-Connections, mHC)核心问题:针对超连接 (Hyper-Connections, HC) 扩展残差流宽度时破坏恒等映射、引发训练不稳定性和高内存开销的问题,提出一种约束性框架。目标:恢复残差连接的稳定性与可扩展性,同时保持HC的性能增益。基准模型:基于DeepSeek-V3的MoE架构,进行了3B、9B、27B模型的实验验证。论文图示mHC 是一个通用的HC扩展框架。

m0_47867638的博客 1352

L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)

1.题目 2.分析 暴力解法 方法1:排序(超时) 方法2:哈希表(险过)  ★判断两个哈希表是否相同算法(通用方法,必须掌握) 能相等的前提:两个哈希表的大小相等 哈希表有迭代器,可以使用范围for从头到尾遍历 提交结果 优化方法:定长滑动窗口 提交结果 使用哈希数组更快 提交结果 ★★★更优化的方法:不定长滑动窗口(比定长的要快!) 提交结果

zhangcoder的博客 记录学习轨迹~ 1609

DICOM图像知识:深入详解DICOM的层级关系

解析DICOM的四个主要层级:Patient(患者)、Study(检查)、Series(序列)和SOP(服务-对象对),探讨它们之间的关系、各自的唯一标识符以及在实际应用中的用途

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3305

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法一)定长滑动窗口+哈希表

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

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1172

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode-438. 找到字符串中所有字母异位词【哈希表 字符串 滑动窗口】

除了直接比较数组是否相等外,其实还可以用双指针来表示滑动窗口的两侧边界,当滑动窗口的长度等于p的长度时,表示找到一个异位词,两种方式的时间复杂度都是O(n)级别的。起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。

zik的博客 1133

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

Python的collections库是一个内建模块,它提供了一系列特殊的容器数据类型,用于扩展Python的标准内建容器(如字典、列表、集合和元组)。这些特殊的容器类型提供了比通用数据类型更多的选择和更好的性能,非常适合在需要高效数据处理和复杂数据结构时使用。具体使用详情官方地址。

LS_Ai的博客 1026

jre9下载 jdk9

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

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

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

qq_38261626的博客 982

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

注意,这里hash表里面仅仅存的是字符,总共26个小写字母,直接遍历一遍出结果就可以,还是很好比较的,但是,如果存的不是字符呢?出窗口前,发现hash2[left] == 2 > hash1[left],那么说明出的这个元素是无效元素,count不需要改变。开始 hash2[s[right]] 进入hash表后,1 <= hash1[c],那么这就是有效元素,count++下一次出窗口时,发现hash2[c] <= hash1[c],诶,就是有效元素了,count–这是再遍历hash去比较,比较的麻烦。

2303_78940834的博客 1万+

LeetCode hot 100 每日一题(8)——438. 找到字符串中所有字母异位词

这是滑动窗口的另一道题目,难度为中等。让我们来看看题目描述:给定两个字符串s和p,找到s中所有p的的子串,返回这些子串的起始索引。不考虑答案输出的顺序。[0,6]起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。[0,1,2]起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。

m0_46464899的博客 1118

[LeetCode 438/567] 找到字符串中所有字母异位词/字符串的排列(滑动窗口)

也可用于 567哈希表记录滑动窗口内字符个数,easy不详细赘述,俺代码可以继续优化,这里用了两个哈希表去做对比,可以优化成一个哈希表上的加减,当hashc==0时,说明当前字符c在字符串p和滑动窗口内出现的次数相同。

qq_45371462的博客 874

滑动窗口——找到字符串中所有字母异位词

然后判断子串的哈希表2和p的哈希表1是否星等,如果相等,则将这段区间的起始位置left记录下来,然后将left位置的元素从哈希表2中删除,然后left++,再让right++,将right位置的元素插入哈希表中,重复这个过程,直到right走到结尾。我们可以先用哈希表1将p字符串的元素都存储起来,然后在遍历子串的时候,将子串的内容放到另一个哈希表2中,然后判断两个哈希表对应元素出现的次数是否相等,如果相等,则就说明它们是异位词;不管我们的算法原理如何,一定是要判断两个单词是否为异位词的,那么要怎么判断呢?

xsc2004zyj的博客 1042

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

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

weixin_42248302的博客 1210

力扣 438.找到字符串中所有字母异位词(C语言)

滑动窗口,哈希数组

2201_75777145的博客 1237

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

这个滑动窗口算法是解决字符串异位词查找问题的经典方法。它的核心思想是通过动态维护一个固定大小的窗口来高效检测异位词。我的解题没有考虑到p中字母可以重复的情况,因为unordered_map容器会去重。然后代码量也很多,确实不是最好的解法。这个算法通过巧妙地维护窗口状态和字符计数,实现了对异位词的高效检测,是处理这类字符串匹配问题的经典方法。需要将滑动窗口算法的精髓给总结一下。代码试图通过哈希表来寻找字符串。同时维护一个关键变量。

hhw_hhw的博客 1036

LeetCode 438. 找到字符串中所有字母异位词 - 滑动窗口与哈希计数详解

题目描述:给定两个字符串 s 和 p,找出 s 中所有与 p 互为字母异位词的子串的起始索引。字母异位词指由相同字符、相同频次构成的字符串,顺序可以不同。返回所有起始索引的列表,按升序排列。原题链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/难度等级:Medium相关标签:字符串、滑动窗口、哈希表、双指针| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 1031

必刷算法100题之找到字符串中所有字母异位词

使用滑动窗口解决字符串中所有字母异位词问题

2201_75880772的博客 857
上一篇: 【哈希-简单】705. 设计哈希集合
下一篇: 【哈希-简单】706. 设计哈希映射(数组法+拉链法(定长拉链+不定长拉链))
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值