给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
hash解法的经典题,就是注意到了一些js API的神奇用法hh
个人觉得,难点在于怎么去构建一个合理的hash表会比较好,之前对hash一直有种“啊好难高级又神秘的方法”的感觉。
做这种题目,首先搞清楚,什么作为key,什么作为value。
再去构建hash表,就容易很多了。
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
// 首先需要根据给定的strs构建一个hash表
let map = new Map();
for(item of strs){
let arr = Array.from(item); // 把字符串转为数组 'eat' -> ['e','a','t']
arr.sort(); // 排序 -> ['a','e','t']
let s = arr.join(''); // 恢复字符串作为key值
let list = map.get(s) ? map.get(s) : new Array(); // 有的话继续在同类异位字母数组中追加,没有就初始化一个新数组
list.push(item);
map.set(s, list); // 构建hash键值对
}
// console.log(map.values())
return Array.from(map.values()); // 注意map.values()方法可以直接获取到所有的属性值
};