leetcode 49题

Posted by franki on June 13, 2021

leetcode 49题 字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例1

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

思路

方法一: 排序

方法二:计数

代码

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
// var groupAnagrams = function(strs) {
//     const map = new Map();
//     for (const str of strs) {
//         // 排序
//         const arr = str.split("");
//         arr.sort();
//         const key = arr.toString();
//         const list = map.get(key) ? map.get(key) : new Array();
//         list.push(str);
//         map.set(key, list);
//     }
//     return Array.from(map.values());
// };

const groupAnagrams = (strs) => {
    // 计数
    const map = new Map();
    for (const str of strs) {
        const array = new Array(26).fill(0);
        const base = 'a'.charCodeAt();
        // 计数每个字母出现出现的次数
        for (const s of str) {
            const num = s.charCodeAt();
            const diff = num - base;
            if (array[diff] === 0) {
                array[diff] = 1;
            } else {
                array[diff]++;
            }
        }

        // 计算当前map的key(通过遍历字母出现次数数组去组合),并统计key对应的数组
        // let key = "";
        // for (let i=0; i<array.length; i++) {
        //     if (array[i] !== 0) {
        //         // key = 字母+次数
        //         key += String.fromCharCode(base + i);
        //         key += array[i];
        //     }
        // }
        const key = array.reduce((prev, curr, i) => {
            if (curr !== 0) {
                prev += String.fromCharCode(base + i);
                prev += array[i];
            }
            return prev;
        }, '');

        const list = map.get(key) ? map.get(key) : new Array();
        list.push(str);
        // key 是唯一,所以能保证不重复
        map.set(key, list);
    }
    return Array.from(map.values());
};

复杂度分析:

方法一:

  • 时间复杂度: O(N)
  • 空间复杂度:O(N)

方法二:

  • 时间复杂度: O(N^2)
  • 空间复杂度:O(N)