leetcode 438. 找到字符串中所有字母异位词(Find All Anagrams in a String)

目录

  • 题目描述:
  • 示例 1:
  • 示例 2:
  • 解法:

题目描述:

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 sp 的长度都不超过 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" 的字母异位词。

解法:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> count(128, 0);
        for(char ch : p){
            count[ch]++;
        }
        int len = p.size();
        int sz = s.size();
        vector<int> res;
        int i = 0, j = 0;
        while(i < sz){
            while(j < sz && count[s[j]] > 0){
                count[s[j]]--;
                j++;
            }
            if(j - i == len){
                res.push_back(i);
                count[s[i]]++;
                i++;
            }else if(i == j){   // the single charactor isn't in p
                j++;
                i = j;
            }else{  // the current charactor exceeds the number in p
                count[s[i]]++;
                i++;
            }
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/zhanzq/p/10583360.html

时间: 2024-10-07 07:42:07

leetcode 438. 找到字符串中所有字母异位词(Find All Anagrams in a String)的相关文章

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

题目 给定一个字符串?s?和一个非空字符串?p,找到?s?中所有是?p?的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串?s?和 p?的长度都不超过 20100. 说明: 字母异位词指字母相同,但排列不同的字符串. 不考虑答案输出的顺序. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明

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

class Solution: def findAnagrams(self, s: str, p: str) -> List[int]: l=0 r=0 res = [] p_d = {} windows_d = {} for _ in p: p_d[_] = p_d.get(_,0)+1 while(r<len(s)): #如果字母不在子串中,清空窗口字典,同时移动左右窗口 if s[r] not in p: l=r=r+1 windows_d.clear() #当字母在子串中,窗口字典计数

c++滑动窗口进阶版求找到字符串中所有字母异位词

/** * 问题:找到字符串中所有字母异位词 * 要求:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. * 注意事项:字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. * 方法1:利用滑动数组去做 * class Solution { private: vector<int>list; int a[26]={0}; int b[26]={0}; public: vector<int> fi

LeetCode 49. 字母异位词分组(Group Anagrams)

49. 字母异位词分组 49. Group Anagrams 题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ??["ate","eat","tea"], ??[&

python学习:找到字符串中第一个只出现一次的字母

''' 找出字符串中第一个只出现一次的字符 ''' def searFisrt(str):     #定义一个数据字典     dic={}     for i in range(len(str)):         if str[i] in dic:             dic[str[i]]+=1         else:             dic[str[i]]=1     for i in range(len(str)):          if dic[str[i]]==1

LeetCode:反转字符串中的元音字母【345】

LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leetcode" 输出: "leotcede" 说明:元音字母不包含字母"y". 题目分析 所谓的做题就是把以前背下来的拿过来改一下即可.双指针碰撞模型,之前已经描述过很多次了,此处不在赘述. 知道AEI

LeetCode 第49题 字母异位词分组

(一) 题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"]

LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)

这是小川的第412次更新,第444篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170).在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字符的出现频率.例如,如果s ="dcce",则f(s)= 2,因为最小字符为"c",其频率为2. 现在,给定字符串数组queries和words,返回一个整数数组answer, 其中每个answer[i]是使得f(queries[i]) < f(W)的单词数量,其

345. 反转字符串中元音字母的位置 Reverse Vowels of a String

Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Given s = "hello", return "holle". Example 2:Given s = "leetcode", return "leotcede" 题意:反转字符串中元音字母的位置 方法1:用栈保存元音字符串,时间