leetcode-查找表-49-字母异位词分组

118 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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()]
};