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

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

时间:2023-11-17 20:34:13浏览次数:43  
标签:子串 needs right 异位 字母 window 字符串 left

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

给定两个字符串 sp,找到 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(object):



    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """

        res = []
        left = 0
        right = 0
        match = 0
        window = {}
        needs = dict((i, p.count(i)) for i in p)

        while right < len(s):
            c1 = s[right]
            if c1 in needs.keys():
                window[c1] = window.get(c1, 0) + 1
                if window[c1] == needs[c1]:
                    match += 1
            right += 1

            while match == len(needs):
                if right - left == len(p):
                    res.append(left)
                c2 = s[left]
                if c2 in needs.keys():
                    window[c2] -= 1
                    if window[c2] < needs[c2]:
                        match -= 1
                left += 1
        return res 
   

模板

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;
    
    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        printf("window: [%d, %d)\n", left, right);
        /********************/
        
        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

作者:labuladong
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:子串,needs,right,异位,字母,window,字符串,left
From: https://www.cnblogs.com/mrmrwjk/p/17839609.html

相关文章

  • PTAC语言删除字符串中的字串
    这是题目。初见觉得还好,谁知道越分析越操蛋暗含深意。仔细看,假设我们通过遍历s1删除了两个显性的cat,哎,剩下的是什么Tomisamalecat咋样,牛逼不。说明这题肯定会出现删除一次不够的样例sample。假设我们熟知C语言中#include<string.h>中的strcat,strstr,strcpy等函数,那么这题可以比......
  • P1098 [NOIP2007 提高组] 字符串的展开(总结)
    P1098[NOIP2007提高组]字符串的展开http://ww.luogu.com.cn/problem/P1098注意字符中的数字是默认小于字母的。所以要对数字做特判。#include<iostream>#include<string>usingnamespacestd;intmain(){ intp1,p2,p3; cin>>p1>>p2>>p3; strings; cin......
  • 无涯教程-D语言 - 字符串(Strings)
    字符数组我们可以用以下两种形式来表示字符数组.第一种形式直接提供大小,第二种形式使用dup方法创建字符串"Goodmorning"。char[9]greeting1="Hellolearnfk";char[]greeting2="Goodmorning".dup;这是使用上述简单字符数组形式的简单示例。importstd.stdio;voidm......
  • 电脑网站支付报错“验签出错,建议检查签名字符串或私钥与应用公钥是否匹配”问题解决记
    在对接支付宝电脑网站支付的时候,遇到如下报错:“错误代码invalid-signature错误原因:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配”。但展示的报错内容跟实际原因有所出入(在下文中有解答),这里记录下问题的解决排查过程。问题复现在对接电脑网站支付时,生成form表单......
  • 来自 szc 的字符串和搜索的总结
    膜拜szc大佬。原链接。题单+代码哈希普通哈希不讲了,讲讲树哈希。对于判断一对同构树,要考虑相同结构的儿子在两类树的不同位置。此时有两种方法,一种是正常的按序哈希,我们很好想到在哈希时对儿子节点的哈希值进行排序,规定一个顺序塞进去。另一种方法则是不使用多项式哈希,对......
  • 151. 反转字符串中的单词
    2023-11-17思路:调用库函数+利用正则表达式利用栈双端队列头插链表利用数组总长度不知道按最大长度10^4利用list进阶:字符串可变时,Java不行,双指针,先整体反转,再逐个反转单词可以将空间复杂度降低 数组:classSolution{publicStringreverseWor......
  • 7-5 字符串排序
    目录目录目录题目代码思路第一次错误尝试错误原因正确代码运行结果关于二维数组的函数引用题目本题要求编写程序,读入5个字符串,按由小到大的顺序输出。输入格式:输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。输出格式:按照以下......
  • 字符串哈希算法
    一、字符串哈希:将一串字符串映射成一个整数,并用它来代替字符串进行比较。这样俩个字符串的比较就变成俩个整数的比较,可以将时间复杂度减少至O(1)二、哈希函数:为了将字符串转化为整数,需要一个哈希函数hash,使得以下条件成立:如果字符串s==t那么hash(s)==hash(t)。一般情况下采......
  • 求删除k个字母后的最小字典序字符串
    对于一个字符串来说我们要找删除k个字母后的最小字典序字符串来说,我们肯定是从前往后来删除,如果遇见前一个字母比后一个字母(字典序)大,那就删除前一个。对于此来说我们用一个vector来维护,vector就是存的答案,如果vector的最后一个字母比枚举的字母大,那就删除最后一个。vector<c......
  • 找出一个字符串中出现次数最多的一个字符 找出重复签到的同学
    7-2找出一个字符串中出现次数最多的一个字符找出一个字符串中出现次数最多的一个字符。输入格式:给出一个字符串,字符串的长度不大于10^6,不区分大小写,字符串中可能包含'A'-'Z','a'-'z',''字符。输出格式:分别输出出现最多次数的字符(如果为字母,输出小写字母),出现的次数,用......