给定两个字符串 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” 的异位词。
/*** @param {string} s* @param {string} p* @return {number[]}*/var findAnagrams = function (s, p) {//需要的字符let need = {}, win = {};//统计异位词的数量for (let a of p) {need[a] = (need[a] || 0) + 1;}//左右指针let l = 0, r = 0;//窗口中和need中字符数量一致的字符种类let val = 0;let res = [];while (r < s.length) {let c = s[r];// 右边的字符进入窗口r += 1;if (need[c]) {// 当前字符在need中,更新窗口中的字符数量win[c] = (win[c] || 0) + 1;if (win[c] == need[c]) {// 该字符在窗口中和need中的字符匹配时,字符种类+1val += 1;}}// 不断出窗口while (r - l >= p.length) {// 如果此时窗口中的子串和p是异位词则将左边界加入res中if (val == Object.keys(need).length) {res.push(l);}let d = s[l];// 出窗口l += 1;// 如果该字符在need中 更新窗口中的字符数量 和字符种类if (need[d]) {if (win[d] == need[d]) {val -= 1;}win[d] -= 1;}}}return res;};

