LeetCode 49 -哈希-字母异位词分组

26 阅读2分钟

题目描述

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

字母异位词指字母相同,但排列不同的字符串。

示例:

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

解题思路

核心思想

字母异位词的特点是:经过排序后,它们会变成相同的字符串。例如:

  • “eat” → “aet”
  • “tea” → “aet”
  • “ate” → “aet”

因此,我们可以将排序后的字符串作为哈希表的键,原始字符串作为值进行分组。

算法步骤

  1. 创建一个哈希表(Map)来存储分组结果

  2. 遍历每个字符串:

    • 将字符串拆分为字符数组
    • 对字符数组进行排序
    • 重新组合成字符串作为键
    • 将原始字符串存入对应的分组
  3. 最后返回哈希表的所有值

代码实现

// 提示:

// 1 <= strs.length <= 104
// 0 <= strs[i].length <= 100
// strs[i] 仅包含小写字母

/**
 * @param {string[]} strs
 * @return {string[][]}
 */

//  先"abc"转成["a", "b", "c"] sort 排序
//  存入map map中有"abc" 存入数组[], 没有新建
var groupAnagrams = function(strs) {
    let res = new Map()
    for(let item of strs) {
        let str = item.split('').sort().join('')  //所有相同的都转成“abc"
        if(res.has(str)){
            res.get(str).push(item)
        } else {
            res.set(str, [item])
        }
    }
    return [...res.values()]
};

let strs = ["eat","tea","tan","ate","nat","bat"]
groupAnagrams(strs)

复杂度分析

  • 时间复杂度:O(n * k * log k),其中 n 是字符串数量,k 是字符串的最大长度。

    • 对每个字符串排序需要 O(k log k)
    • 遍历 n 个字符串
  • 空间复杂度:O(n * k),需要存储所有字符串

关键点解析

  1. 排序技巧split('').sort().join('') 是将字符串转换为标准形式的关键步骤
  2. 哈希表使用:使用 Map 可以方便地存储和检索分组
  3. 结果转换[...res.values()] 将 Map 的值转换为数组