// JS相关实现
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
var needMap = {}; // 实际需要的hashMap
for(var i = 0; i < p.length; i++) {
needMap[p[i]] ? needMap[p[i]]++ : needMap[p[i]] = 1;
}
var needLen = Object.keys(needMap).length;
var realMap = {}; // 窗口的hashmap
var res = [];
var l = 0, r = 0;
var matchCount = 0; // 匹配到的字母总个数
while(r < s.length) {
var cur = s[r];
// 当前元素 是 需要的元素
if(needMap[cur]) {
// 窗口map 计数
realMap[cur] ? realMap[cur]++ : (realMap[cur] = 1);
// 如果数量相等了,匹配到的个数就 +1
if(needMap[cur] === realMap[cur]) {
matchCount++;
}
}
r++;
while(matchCount === needLen) {
var leftItem = s[l];
if((r - l) === p.length) {
res.push(l);
}
if(needMap[leftItem] && realMap[leftItem]) {
realMap[leftItem]--;
if(realMap[leftItem] < needMap[leftItem]) {
matchCount--;
}
}
l++;
}
}
return res;
};
老师,关于这题我有个疑问,我们在记录窗口中的字母个数时, 遇到是我们需要的字母 就会计数, 那如果碰到了 其他字母 却没有重置map, 是因为 我们这里考虑的子串 是 不一定要连续的吗? 在官方题目描述上没有看到关于这块的描述。
登录后可查看更多问答,登录/注册