【图解乱杀算法】49.字母异位词分组

38 阅读1分钟

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 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()方法可以直接获取到所有的属性值
};