给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 :::info 示例1:
输入: s = “anagram”, t = “nagaram”
输出: true

示例2:
输入: s = “rat”, t = “car”
输出: false :::

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

解法一

首先我们可以判读两个字符串的长度,如果长度不一致则直接返回 false.
然后我们可以构建一个哈希表map,先去遍历记录s中的元素的个数,然后再去遍历t中元素i。有以下两种情况:

  • map中不存在i,直接返回 false.
  • map中存在imap中对应记录数减一,判断map中对应记录数是否为大于 -1 ,若否则直接返回 false

    1. var isAnagram = function(s, t) {
    2. const lenS = s.length, lenT = t.length;
    3. if (lenS !== lenT) return false;
    4. const map = new Map();
    5. for (let i = 0; i < lenT; i++) {
    6. map.set(s[i], (map.get(s[i]) || 0) + 1);
    7. }
    8. for (let i = 0; i < lenT; i++) {
    9. if (map.has(t[i])) {
    10. map.set(t[i], map.get(t[i]) - 1);
    11. if (map.get(t[i]) < 0) {
    12. return false;
    13. }
    14. } else {
    15. return false
    16. }
    17. }
    18. return true;
    19. };

    解法二

    可以创建一个数组,长度为26,分别对应26个字母,然后每个元素记录s中出现元素个数。
    然后再次遍历t中元素减去相应元素记录数即可。

    1. var isAnagram = function(s, t) {
    2. if(s.length !== t.length) return false;
    3. const resSet = new Array(26).fill(0);
    4. const base = "a".charCodeAt();
    5. for(const i of s) {
    6. resSet[i.charCodeAt() - base]++;
    7. }
    8. for(const i of t) {
    9. if(!resSet[i.charCodeAt() - base]) return false;
    10. resSet[i.charCodeAt() - base]--;
    11. }
    12. return true;
    13. };