持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
一、题目描述
给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。
注意: 若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。
示例 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 对象,用于存储排序后的字符串;
- 遍历字符串数组
strs,将遍历到的元素转为数组并排序; - 将排序后的当前元素转为字符串,以此作为
key值查找 Map 对象中是否有相同元素- 没有则定义一个空数组,将当前元素
push进去,将数组存进 Map 中键为key的位置上; - 有则取出 Map 对象上索引为
key的值(一个数组),将当前元素push进该数组,同样将push后的数组存进 Map 中键为key的位置上。
- 没有则定义一个空数组,将当前元素
- 遍历完成后,我们得到了一个 键为变位词的其中一种排列、值为变位词数组 的 Map 对象。取出 Map 对象的所有键值,放进数组中即为答案。
三、AC 代码
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
let map = new Map();
for (let str of strs) {
const arr = [...str];
arr.sort();
const key = arr.toString();
let list = map.get(key) ? map.get(key) : [];
list.push(str);
map.set(key, list);
}
return Array.from(map.values());
};