/**
 * @param {string} word1
 * @param {string} word2
 * @return {boolean}
 */
var closeStrings = function (word1, word2) {
  if (word1.length !== word2.length) return false;
  let word1Map = new Map(), word2Map = new Map()

  for (let i = 0; i < word1.length; i++) {
    word1Map.set(word1[i], (word1Map.get(word1[i]) ?? 0) + 1)
  }

  for (let i = 0; i < word2.length; i++) {
    word2Map.set(word2[i], (word2Map.get(word2[i]) ?? 0) + 1)
  }

  if (word1Map.size !== word2Map.size) return false

  for (let [key, value] of word1Map) {
    if (!word2Map.has(key)) return false
  }

  let l1 = Array.from(word1Map.values()).sort(), l2 = Array.from(word2Map.values()).sort()

  for (let i = 0; i < l1.length; i++) {
    if (l1[i] !== l2[i]) return false;
  }

  return true;
};