242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若  s 和 t  中每个字符出现的次数都相同,则称  s 和 t  互为字母异位词。

示例  1:


输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

1 <= s.length, t.length <= 5 * 104 s 和 t  仅包含小写字母

进阶:  如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

解法

1、哈希表(自己的解法,很 low, 但是能用)

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false;
  }

  const sMap = {};
  const tMap = {};

  for (let i = 0; i < s.length; i++) {
    if (sMap[s[i]]) {
      sMap[s[i]]++;
    } else {
      sMap[s[i]] = 1;
    }
  }

  for (let j = 0; j < t.length; j++) {
    if (tMap[t[j]]) {
      tMap[t[j]]++;
    } else {
      tMap[t[j]] = 1;
    }
  }

  return !Object.keys(sMap).find((item) => tMap[item] !== sMap[item]);
};

哈希表另一种解法

var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false;
  }
  const table = new Array(26).fill(0);
  for (let i = 0; i < s.length; ++i) {
    table[s.codePointAt(i) - "a".codePointAt(0)]++;
  }
  console.log(table);
  for (let i = 0; i < t.length; ++i) {
    table[t.codePointAt(i) - "a".codePointAt(0)]--;
    if (table[t.codePointAt(i) - "a".codePointAt(0)] < 0) {
      return false;
    }
  }
  return true;
};

2、排序

有点投机取巧

思考:想不到字符串还可以这样排序!!!

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  return (
    s.length === t.length && [...s].sort().join("") === [...t].sort().join("")
  );
};