定长滑窗
维护长为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 的元素离开窗口,更新相关统计量