首页 > 其他分享 >438. 找到字符串中所有字母异位词(中)

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

时间:2024-03-14 11:22:41浏览次数:26  
标签:子串 ab 异位 起始 索引 438 字符串

目录

题目

  • 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
    异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 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" 的异位词。

题解:滑动窗口

class Solution:
    def findAnagrams(self, s: str, t: str) -> List[int]:
        need={}# 存储字符串 t 中各个字符的需求量
        window={}# 存储滑动窗口中各个字符的出现次数
        for c in t:#遍历字符串t
            need.setdefault(c,0)#访问不存在的键时自动创建并将值设置为 0
            need[c]+=1# 统计字符串 t 中各个字符的需求量
        left=0# 滑动窗口的左指针
        right=0# 滑动窗口的右指针
        valid=0# 记录满足需求的字符数
        res=[]#结果列表
        while right<len(s):
            c=s[right]# 当前字符
            right+=1# 右指针右移
            if c in need:#当前字符是目标字符中的
                window.setdefault(c,0)#访问不存在的键时自动创建并将值设置为 0
                window[c]+=1# 更新滑动窗口中当前字符的出现次数
                if window[c]==need[c]:
                    valid+=1# 如果滑动窗口中当前字符的出现次数达到需求量,增加满足需求的字符数
            while valid==len(need):#每个字符的次数都达到了要求
                if right-left==len(t):#数量也是相等的话
                    res.append(left)#把第一个索引的坐标加入结果列表
                d=s[left]# 将要移出窗口的字符
                left+=1# 左指针右移
                if d in need:#当前字符是目标字符中的
                    if window[d]==need[d]:#如果滑动窗口中当前字符等于目标字符的值
                        valid-=1# 如果移出窗口的字符导致窗口不再满足需求,则减少满足需求的字符数
                    window[d]-=1# 更新滑动窗口中移出字符的出现次数
        return res#返回结果列表

标签:子串,ab,异位,起始,索引,438,字符串
From: https://www.cnblogs.com/lushuang55/p/18072364

相关文章

  • 洛谷 P4173 残缺的字符串 卡常小记
    首先,使用匹配函数\(P(x_i,x_j)=x_ix_j-x_i^2[j\neq0]\)。容易发现,当存在\(i\neqj\)时,\(x_ix_j\)的系数只会增加,因此根据Schwartz-Zippel引理,随机一组\(x_{1\sim26}\)对应a~z即可。然后,对于NTT的过程,有两个卡常的点:一是点积reverse后转卷积的过程是舍......
  • js判断数组是否包含某个字符串
    方法1Array.includes(): 这个方法返回一个布尔值,表示数组中是否包含指定的元素letlist=['a','ab','abc','d'];console.log(list.includes('abc'))//true方法2Array.indexOf():这个方法返回指定元素在数组中的第一个匹配位置的索引,如果找不到则返回-1。letlist=......
  • 华为机试题-字符串压缩
    题目给定段英文句子和—个英文单词列表。英文句子包含英文单词和标点符号,其中:1)英文单词只包含[a-zA-Z]范国内的字符;2)标点符号包括逗号、句号、双引号(双引号两边至少有一个空格)。如果列表中有单词在句子中存在(大小写不敏感)且该单词未被双引号包含,则使用该单......
  • 字符串哈希——洛谷P3370
    1.简介本文主要介绍三种实现哈希表的方法:进制哈希,set哈希,map哈希。2.进制哈希#include<iostream>#include<vector>#definemod1000usingnamespacestd;intn,hs,ans;vector<string>a[mod];//数组开多大,取决于mod取多大strings;......
  • 2024最新华为OD机试试题库全 -【提取字符串中最长合法简单数学表达式】- C卷
    1.......
  • 04_C++字符串_vector使用
    1.初始化vector vector<int>v1;默认初始化vector<int>v2(10);10个int类型的元素,初始化值为-1vector<string>v3{"a","bb","ccc"};列表初始化,包括三个元素2.向vector添加元素#include<iostream>#include<string>#include<vector>......
  • c#字符串处理 :多空格,多逗号
    1.正规表达式:System.Text.RegularExpressions.Regex.Replace(str,"([]+)","") --  str是输入或要检测的字符串。正则表达式方法Regex.Replace()和匹配符\s(匹配任何空白字符,包括空格,制表符,换页符等,与[\f\n\t\r\v]等效)//使用正则去除空格,换行,制表符,换页符Regexregex=n......
  • 字符串将最后一个字符“,”去掉
    //第一种方法、将字符串中最后一个元素","逗号去掉,//str=str.substring(0,str.lastIndexOf(','));//第二种方法、将字符串中最后一个元素","逗号去掉,//str=(str.substring(str.length-1)==',')?str.substring(0,str.length-1):str;......
  • python Ai 应用开发基础训练,字符串,字典,文件,函数,装饰品,生成器(下)
    生成器的另一个示例,这个生成器功能是从大小生,生成斐波那契数列deffib(max):#定义一个函数fib,参数为maxa,b=0,1#初始化两个变量a和b,分别赋值为0和1n=0#初始化计数变量n为0whileb<max:#当b小于max时继续循环print(b)#打印当前的斐波......
  • 4.13 ACM-ICPC算法 字符串之后缀自动机
    4.13ACM-ICPC算法:字符串之后缀自动机在竞赛编程,尤其是ACM-ICPC竞赛中,字符串算法占据了极其重要的位置。其中,后缀自动机(SuffixAutomaton,简称SAM)以其强大的功能和高效的性能,成为了解决字符串问题的利器。本文旨在介绍后缀自动机的基本概念、构建方法以及在算法竞赛中的应......