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

题目

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

字符串只包含小写英文字母,并且字符串?s?和 p?的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。

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

题解

代码

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        if(s==null||p==null){
            return null;
        }

        List<Integer> ansList=new ArrayList<Integer>();
        HashMap<Character,Integer> needs=new HashMap<>();
        HashMap<Character,Integer> window=new HashMap<>();

        for(int i=0;i<p.length();++i){
            needs.put(p.charAt(i),needs.getOrDefault(p.charAt(i),0)+1);
        }

        int l=0;
        int r=0;
        int matchCnt=0;
        int hopMatchCharCnt=needs.size();//
        while(r<s.length()){
            char c=s.charAt(r);
            if(needs.containsKey(c)){
                window.put(c,window.getOrDefault(c,0)+1);
                if(window.get(c).equals(needs.get(c))){
                    ++matchCnt;
                }
            }

            while(matchCnt==hopMatchCharCnt){//
                if(r-l+1==p.length()){//
                    ansList.add(l);
                }

                //包含子串情况下l不断右移
                char leftC=s.charAt(l);//
                if(window.containsKey(leftC)){
                    window.put(leftC,window.get(leftC)-1);//
                    if(window.get(leftC)<needs.get(leftC)){
                        --matchCnt;
                    }
                }
                ++l;
            }

            ++r;
        }
        return ansList;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/11324629.html

时间: 2024-10-04 01:00:35

[LeetCode]438. 找到字符串中所有字母异位词的相关文章

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

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: 字母异位词指字母相同,但排列不同的字符串. 不考虑答案输出的顺序. 示例 1: 输入: s: "cbaebabacd" p: "abc" 输出: [0, 6] 解释: 起始索引等于 0 的子串是 "

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

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:用栈保存元音字符串,时间

【leetcode 简单】 第七十题 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母. 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? class Solution: