思路:
滑动窗口+双指针
使用pMap统计p中所有字母及出现次数,使用sMap统计s窗口内的字母及出现次数
left、right初始化为0,right开始向右遍历,如果right-left+1的长度和p相同,此时比较pMap、sMap是否相同,如果相同,那么添加left到res中,此时left+1向右移动(即代表窗口向右移动一格)
import (
"encoding/json"
"reflect"
)
func FindAnagrams(s string, p string) []int {
res := make([]int, 0)
left := 0
right := 0
sMap := make(map[string]int32)
pMap := make(map[string]int32)
for i := range p {
pMap[string(p[i])] = pMap[string(p[i])] + 1
}
for right < len(s) {
r := string(s[right])
sMap[r] = sMap[r] + 1
if right-left+1 == len(p) {
bytes, _ := json.Marshal(sMap)
println(string(bytes))
//比较两个map
if reflect.DeepEqual(pMap, sMap) {
res = append(res, left)
}
sMap[string(s[left])] = sMap[string(s[left])] - 1
if sMap[string(s[left])] == 0 {
delete(sMap, string(s[left]))
}
left++
}
right++
}
return res
}