原题如下:
简单说就是构成一个字母的单词,重新排序可以组成新的单词,要求把strs数组中包含字母一样的单词放到一个新的数组中
解题思路就是用到哈希表来解决,这个题可以用两个指标来作为哈希表的键,首先说第一个
①字母出现次数:
所有的异位词中,每个字母的出现次数相同,例如:tea eat中 a e t 分别只出现了一次,所以可以考虑用字母的出现次数做为哈希表的键,具体代码如下(下述代码均为JavaScript代码):
var groupAnagrams = function(strs) {
const map = new Object();//创建一个名为map的哈希表
for (let s of strs){
count = new Array(26).fill(0);//创建一个长度为26的数组并用0填满,来作为字母的出现次数
for ( let c of s){
count[c.charCodeAt() - 'a'.charCodeAt()]++;//在count数组0-25的索引代表从a到z排列
}//如果a出现一次,就让count[0]++,其它字母同理
map[count] ? map[count].push(s) : map[count]=[s];
}//这是一个三目表达式,如果map哈希表中的键count存在,那就让字符s加入到该count键所对应的数组的最后一位;
//如果不存在,将字符串s构建为一个新的数组加入到该count键所对应的数组的第一位
return Object.values(map);
};
②所出现的字母:
所有的异位词中,总共出现字母的字母一定相同,例如 tea 和eat中 只存在 a e t这三个字母,所以,可以考虑让排序后的字母作为键,具体代码如下:
var groupAnagrams = function(strs) {
const map = new Map();//Map()可以用来存储键值对,并且可以记忆键值对的插入顺序
for (let str of strs){
//这里考虑要给字母排序,所以先将str从字符串转化为数组
//因为sort是数组的内置方法
let array = Array.from(str);
array.sort();
let key = array.toString();//再将排序后的字符数组转换为字符串,然后作为哈希表的键
let list = map.get(key) ? map.get(key) : new Array();
//如果key对应的value存在,就将该value赋值给list ,否则创建一个新的数组
//因为第一次遍历,key对应的value肯定不存在,所以会创建一个新的数组赋值给list
list.push(str);
//然后list将这个str如tea添加到数组中
map.set(key ,list);
//此时map中aet键对应的value为list数组中的tea
//下次遍历时,如果判断map.get(abc)是否存在,如果存在就调用已经存放了tea的那个list
}
return Array.from(map.values());
};