题目描述
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 1:
输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。
示例 2:
输入: s = “abab”, p = “ab”
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。
思路&js代码
1、滑动窗口
function findAnagrams(s, p) {
if (s.length < p.length) return []
const map = new Map()
for (let i = 0; i < p.length; i++) {
const char = p[i]
map.set(char, (map.get(char) || 0) + 1)
}
for (let i = 0; i < p.length; i++) {
const char = s[i]
if (map.has(char)) {
map.set(char, map.get(char) - 1)
}
}
const result = []
for (let left = 0, right = p.length; right <= s.length; left++, right++) {
if (Array.from(map.values()).every(item => item === 0)) result.push(left)
if (map.has(s[left])) map.set(s[left], map.get(s[left]) + 1)
if (map.has(s[right])) map.set(s[right], map.get(s[right]) - 1)
}
return result
};