leetcode - 438. Find All Anagrams in a String

Description

Given two strings s and p, return an array of all the start indices of p's anagrams in s. You may return the answer in any order.

An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.

Example 1:

复制代码
Input: s = "cbaebabacd", p = "abc"
Output: [0,6]
Explanation:
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

复制代码
Input: s = "abab", p = "ab"
Output: [0,1,2]
Explanation:
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".

Constraints:

复制代码
1 <= s.length, p.length <= 3 * 10^4
s and p consist of lowercase English letters.

Solution

Sliding window, use a hash table to keep track of all the characters we have already visited. If all the characters are visited, then we get our answer.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( n ) o(n) o(n)

Code

python3 复制代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        available_chars = {}
        for c in p:
            available_chars[c] = available_chars.get(c, 0) + 1
        distinct_chars = len(available_chars)
        left = -1
        res = []
        cur_chars = available_chars.copy()
        for right in range(len(s)):
            if s[right] not in available_chars:
                left = right
                cur_chars = available_chars.copy()
            else:
                while cur_chars[s[right]] <= 0:
                    left += 1
                    cur_chars[s[left]] += 1
                cur_chars[s[right]] -= 1
            if list(cur_chars.values()) == [0] * distinct_chars:
                res.append(left + 1)
        return res

Other method sliding window

python3 复制代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        p_chars = {}
        for c in p:
            p_chars[c] = p_chars.get(c, 0) + 1
        s_chars = {}
        left = -1
        res = []
        for right in range(len(s)):
            s_chars[s[right]] = s_chars.get(s[right], 0) + 1
            while len(s_chars) > len(p_chars) or s_chars.get(s[right], 0) > p_chars.get(s[right], 0):
                left += 1
                s_chars[s[left]] -= 1
                if s_chars[s[left]] == 0:
                    s_chars.pop(s[left])
            if s_chars == p_chars:
                res.append(left + 1)
        return res
相关推荐
可编程芯片开发几秒前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星9 分钟前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮12 分钟前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840717 分钟前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>1 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC2 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
asdzx672 小时前
使用 Python 精准操控 Word 字体:获取与替换方案
python·c#·word
To_OC2 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师2 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水2 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试