/*
 * @lc app=leetcode.cn id=438 lang=javascript
 *
 * [438] 找到字符串中所有字母异位词
 */

// @lc code=start
/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function (s, p) {
  // 1. 超时
  // const target = Array.from(p).sort().toString();

  // const plen = p.length;
  // const slen = s.length;
  // if (slen < plen) return []
  // const result = []

  // for (let i = 0; i <= slen - plen; i++) {
  //   const cur = Array.from(s.slice(i, i + plen)).sort().toString();
  //   if (cur === target) {
  //     result.push(i);
  //   }
  // }
  // return result;

  // 2. 哈希
  const slen = s.length, plen = p.length;
  if (slen < plen) return []

  const result = []

  const sCount = new Array(26).fill(0)
  const pCount = new Array(26).fill(0)
  for (let i = 0; i < plen; i++) {
    ++pCount[p[i].charCodeAt() - 'a'.charCodeAt()];
    ++sCount[s[i].charCodeAt() - 'a'.charCodeAt()];
  }
  if (pCount.toString() === sCount.toString()) {
    result.push(0)
  }

  for (let j = 0; j < slen - plen; j++) {
    --sCount[s[j].charCodeAt() - 'a'.charCodeAt()];
    ++sCount[s[j + plen].charCodeAt() - 'a'.charCodeAt()];

    if (sCount.toString() === pCount.toString()) {
      result.push(j + 1)
    }
  }

  return result;
};
// @lc code=end
console.log(findAnagrams('abab', 'ab'))