传送门: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 <= 1040 <= strs[i].length <= 100strs[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小贴士
- map.get()和map.has()未读取到时返回值不同
- 由于js是弱类型语言,两个都可以用于条件判断
- 但要注意的是如果map.get(1)的返回值如果是0,那么在条件判断会被判为false,因此在条件判断时最好使用map.has()
- of与in也有区别
- (let str of strs)【读取的是str的值】
- (let str in strs)【读取的是str的数字索引】