LC 438滑动窗口与前缀和中等第 12 / 95 题

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

Find All Anagrams in a String

滑动窗口定长窗口
本机进度仅保存在当前浏览器

题目描述

给定两个字符串 s 和 p,找到 s 中所有 p 的异位词(字母相同、顺序可不同)子串,返回这些子串的起始索引。

示例:s = "cbaebabacd",p = "abc",输出 [0, 6],对应子串 "cba" 与 "bac"。

解题思路

  1. 异位词长度固定为 len(p),是典型的定长滑动窗口:窗口每次右移一格,进一个字符出一个字符。
  2. 维护窗口内字母计数与 p 的计数,比较是否相等;用「差值计数」或 matched 变量避免每步 O(26) 全比较。
  3. 窗口长度未达到 len(p) 前只进不出,达到后每步先出后进(或先判再出),保持定长。

参考实现

查看参考实现Python · 建议先自行作答
from collections import Counter

def findAnagrams(s, p):
    need = Counter(p)
    window = Counter()
    res = []
    k = len(p)
    for i, ch in enumerate(s):
        window[ch] += 1
        if i >= k:
            left = s[i - k]
            window[left] -= 1
            if window[left] == 0:
                del window[left]
        # 定长窗口计数与目标一致即为异位词
        if i >= k - 1 and window == need:
            res.append(i - k + 1)
    return res

复杂度与归属

时间复杂度O(n)
空间复杂度O(|Σ|)
所属分类滑动窗口与前缀和
题源LeetCode 438

关联教程

返回题图鉴