LeetCode 热题 100 之第2题 字母异位词分组(JavaScript篇)

94 阅读2分钟

传送门:49. 字母异位词分组 - 力扣(LeetCode)

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

 

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

解答思路

可以通过将每个单词的字母排序后作为唯一标识键,利用Map.groupBy方法将字母异位词分组:首先将字符串拆分为字符数组并排序,然后将排序后的字符重新组合成字符串作为分组依据,最后将Map中的分组结果转换为数组返回,从而高效实现了字母异位词的分组功能。

参考代码

// 定义字母异位词分组函数
var groupAnagrams = (strs) => {
    // 使用Map.groupBy方法对字符串数组进行分组
    const groupedMap = Map.groupBy(strs, (s) => {
        // 将字符串拆分为字符数组
        const chars = s.split("");
        // 对字符数组进行排序
        const sortedChars = chars.sort();
        // 将排序后的字符数组重新组合为字符串
        const sortedStr = sortedChars.join("");
        // 返回排序后的字符串作为分组键
        return sortedStr;
    });
    
    // 获取分组Map中的所有值
    const groups = groupedMap.values();
    
    // 将分组结果转换为数组并返回
    return Array.from(groups);
};

可以整合在一起,一行代码解决。

var groupAnagrams = (strs)=> {
    return Array.from(Map.groupBy(strs, (s) =>s.split("").sort().join("")).values())
};

map小贴士

image.png

  1. map.get()和map.has()未读取到时返回值不同
    • 由于js是弱类型语言,两个都可以用于条件判断
    • 但要注意的是如果map.get(1)的返回值如果是0,那么在条件判断会被判为false,因此在条件判断时最好使用map.has()
  2. of与in也有区别
  • (let str of strs)【读取的是str的值】
  • (let str in strs)【读取的是str的数字索引】