携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104 0 <= strs[i].length <= 100 strs[i] 仅包含小写字母
思路
1.这道题 采用 hash 查找的思路来解决
2.整体思路是:首先定义一个hash表,用hash来存储字母相同的单词;然后将每一个单词的字母排序后当做key,保证相同字母的单词的key相同,遍历一次数组即可将所有字母相同的单词放到同一个key中。
3.接下来我们一起来分步骤详细的根据上面的思路来实现这到算法题
4.首先定义一个map来表示hash
let hash = new Map()
5.然后开始遍历整个数组
for(let i = 0; i < strs.length; i++) {
}
6.接着在遍历过程中,将数组中的每一项数组进行排序后以逗号分割
for(let i = 0; i < strs.length; i++) {
let str = strs[i].split('').sort().join()
}
7.判断hash表中是否存在当前遍历的数组项
8.如果hash表中没有当前遍历的数组项,那么就将当前的数组项当做key存到hash表中,值就是该项的单词
hash.set(str, [strs[i]])
9.如果hash表中有当前遍历的数组项,首先从hash表中获取该当前遍历的数组项的值,用变量temp表示,temp次数是个数组,将该当前遍历的数组项的值添加到temp中,再使用hash表将当前遍历的数组项和temp存储到hash中
if(hash.has(str)) {
let temp = hash.get(str)
temp.push(strs[i])
hash.set(str, temp)
}
10.最后hash中就存在了所有的符合条件的值,最后返回即可
return [...hash.values()]
代码
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
let hash = new Map()
for(let i = 0; i < strs.length; i++) {
let str = strs[i].split('').sort().join()
console.log(str, strs[i])
if(hash.has(str)) {
let temp = hash.get(str)
temp.push(strs[i])
hash.set(str, temp)
} else {
hash.set(str, [strs[i]])
}
}
return [...hash.values()]
};