哈希表-242.有效的字母异位词

76 阅读1分钟

题目描述

给定两个字符串 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 仅包含小写字母

解题思路

使用 Map 对象统计每个字符在字符串 s 中出现的次数,键是字符,值是字符出现的次数,然后遍历字符串 t,检查每个字符在 Map 对象中的记数是否相等,如果不相等则返回 false,否则对应的字符记数减1。如果没有返回 false,说明两个字符串是字母异位词,返回 true。

时间复杂度 O(n),其中 n 是字符串 s 和 t 的长度之和。

代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    // 如果长度不相等,肯定不是字母异位词
    if (s.length !== t.length) {
        return false;
    }
    // 使用 record 来记录字符出现的次数
    let record = new Map();
    
    // 遍历字符串 s,统计每个字符出现的次数
    for (let i = 0; i < s.length; i++) {
        const char = s[i];
        // 如果 record 中已经有该字符,则将其计数加1;否则将其计数设为1
        record.set(char, (record.get(char) || 0) + 1);
    }
    
    // 遍历字符串 t,检查每个字符在 record 中的计数是否与 s 中相等
    for (let j = 0; j < t.length; j++) {
        const char = t[j];
        // 如果record中没有该字符,或者该字符的计数已经为0,则说明不是字母异位词
        if (!record.has(char) || record.get(char) === 0) {
            return false;
        } else {
            // 将 record 中对应字符的次数减 1
            record.set(char, record.get(char) - 1);
        }
    }
    return true;
};