leetcode

我的 leetcode 题解(JavaScript)


/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
const findAnagrams = function (s, p) {
  const slen = s.length, plen = p.length, res = [], pmap = {};
  let begin = 0, end = 0;
  for (let i = 0; i < plen; ++i) {
    if (pmap[p[i]] > 0) {
      ++pmap[p[i]];
    } else {
      pmap[p[i]] = 1;
    }
  }
  // console.log(pmap);
  let count = Object.keys(pmap).length;
  while (end < slen) {
    // if (pmap[s[end]] >= 0) { // 如果 pmap 中包含 s[begin]
    if (s[end] in pmap) { // 如果 pmap 中包含 s[begin]
      --pmap[s[end]];
      if (pmap[s[end]] === 0) {
        --count;
      }
    }
    ++end;
    while (count === 0) {
      // if (pmap[s[begin]] >= 0) { // 如果 pmap 中包含 s[begin]
      if (s[begin] in pmap) { // 如果 pmap 中包含 s[begin]
        if (pmap[s[begin]] === 0) {
          ++count;
        }
        ++pmap[s[begin]]
        // if (pmap[s[begin]] > 0) {
        //   ++count;
        // }
      }
      if (end - begin === plen) {
        res.push(begin);
      }
      ++begin;
    }
  }
  // console.log(res);
  return res;
};
// const eq = function (a, b_sort) {
//   const a_sort = a.split('').sort(function (aa, bb) { return aa.localeCompare(bb) }).join('')
//   return a_sort === b_sort;
// }
findAnagrams("aa", "bb")
findAnagrams("cbaebabacd", "abc")
findAnagrams("abab", "ab")
findAnagrams("abacbabc", "abc")

这里有一个很棒的关于 leetcode 用到了滑动窗口的题的总结 https://leetcode.com/problems/find-all-anagrams-in-a-string/discuss/92007/Sliding-Window-algorithm-template-to-solve-all-the-Leetcode-substring-search-problem.