LeetCode 热题 HOT 100(滑动窗口)438. 找到字符串中所有字母异位词

48 阅读1分钟

定长滑窗

维护长为n的子串 s' 的每种字母的出现次数,如果 s' 的每种字母的出现次数和p的字母出现次数相同,那么 s' 时p的异位词,把 s' 的起始下标加入结果集。

func findAnagrams(s string, p string) (ans []int) {
    cntP := [26]int{}
    cntS := [26]int{}

    for _, c := range p {
        cntP[c-'a']++
    }

    left := 0
    for right, c := range s {
        // 右端字母进入窗口
        cntS[c-'a']++
        left = right - len(p) + 1
        if left < 0 {  // 窗口长度不足
            continue
        }
        if cntS == cntP {
            ans = append(ans, left)
        }
        // 左端字母离开窗口
        cntS[s[left]-'a']--
    }

    return ans
}

定长滑动窗口解题核心思想

核心思想

我们要计算所有长度恰好为 k 的子串中,最多可以包含多少个元音字母。

套路:入-更新-出

  • 入:下标为i的元素进入窗口,更新相关统计量,如果 i < k-1 则重复第一步
  • 更新:更新答案,一般是更新最大值/最小值
  • 出:下标为 i-k+1 的元素离开窗口,更新相关统计量