[路飞]_leetcode-242-有效的字母异位词

432 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

[题目地址] [B站地址]

给定两个字符串 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 记录每个字符串中出现的字符及其出现的次数

遍历某个字符的 map ,判断另一个字符的 map 中是否存在同样的 key 以及对应的值 val 是否相等,如果不相等,则说明不是互为字母异位词

如果相等,在两个 map 中同时删除该 key

最后判断两个字符串对应的 map 是否都为空即可

代码如下:

var isAnagram = function(s, t) {
    const lens = s.length,
    lent = t.length;
    // 判断长度是否相等
    if(lens !== lent) return false;
    // map记录出现的字符及其数量
    const maps = new Map(),
    mapt = new Map();
    for(let i = 0;i<lens;i++){
        let cur = s[i]
        if(maps.has(cur)){
            maps.set(cur,maps.get(cur)+1)
        }else{
            maps.set(cur,1)
        }

        cur = t[i]
        if(mapt.has(cur)){
            mapt.set(cur,mapt.get(cur)+1)
        }else{
            mapt.set(cur,1)
        }
    }
    // 对比两个map是否相等
    for(let item of maps){
        if(mapt.get(item[0])!== item[1]) return false;
        maps.delete(item[0])
        mapt.delete(item[0])
    }
    // 如果两个map均为空,则说明是互为字母异位词
    return maps.size===0 && mapt.size===0
};

至此我们就完成了 leetcode-242-有效的字母异位词

如有任何问题或建议,欢迎留言讨论!