题目
点击前往
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
1 2 3 4 5
| 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
|
示例 2:
1 2 3 4 5 6
| 输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
|
解题思路
- 利用哈希表。
- 首先将p中所有字符进行统计,使用哈希表进行存储。
- 利用双指针来控制范围并判断是否是异位词。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
var findAnagrams = (s, p) => { const need = new Map(); const window = new Map(); for (const char of p) { need.set(char, (need.get(char) || 0) + 1); } let [left, right] = [0, 0]; let valid = 0; const res = []; const lenS = s.length; const lenP = p.length; while (right < lenS) { const c = s[right++]; if (need.get(c)) { window.set(c, (window.get(c) || 0) + 1); if (window.get(c) === need.get(c)) valid++; } while (right - left >= lenP) { if (valid === need.size) res.push(left); const d = s[left++]; if (need.get(d)) { if (window.get(d) === need.get(d)) valid--; window.set(d, window.get(d) - 1); } } } return res; };
|