题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
解释:
在 strs 中没有字符串可以通过重新排列来形成 “bat”。
字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
思考一
字母异位词表示组成的字母数量和字母都相同但位置不同的单词,可以用哈希表根据这个特征把这些字母异位词进行归类。遍历每个单词,并对单词的字符序列按字典序进行排序后重组作为哈希表的 key,哈希表的值存储字母异位词数组。判断如果枚举的单词字符序列按字典序排序后从哈希表中查不到,则作为新的key添加到哈希表,哈希表value存储一个数组,放入排序前的单词字符串;如果哈希表中已存在key,则直接把未排序的单词字符串存入对应key的数组中。最后遍历哈希表把所有值放入一个大数组中返回答案。遍历一遍单词数组 O(n)O(n)O(n),记每个单词的长度为 mmm,则单词排序约 O(mlogm)O(mlogm)O(mlogm),总的时间复杂度为 O(nmlogm)O(nmlogm)O(nmlogm),空间复杂度为哈希表长度乘以每个值数组的长度约为O(nm)O(nm)O(nm)。
代码
/*** @param {string[]} strs* @return {string[][]}*/
var groupAnagrams = function(strs) {let map = new Map();for (let s of strs) {let s_ = s.split('').sort().join('');if (map.has(s_)) {map.get(s_).push(s);continue;}map.set(s_, [s]);}return Array.from(map.values