49. 字母异位词分组

Origin: LeetCode 49

题目描述

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

示例

Input: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]]

Explanation:

  • “eat”、“tea”、“ate” 是一组
  • “tan”、“nat” 是一组
  • “bat” 单独一组

约束

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

关键信息

  • 异位词 = 字母相同排列不同
  • 分组 = 找共同 key
  • key 可以是排序后的字符串,也可以是字母频次

Resolution

我的解法

function groupAnagrams(strs: string[]): string[][] {
    const strMap = new Map()
    for (let i = 0; i < strs.length; i++) {
        let cur = strs[i]
        let sortedCur = cur.split('').sort().join('')
        if (strMap.has(sortedCur)) {
            strMap.set(sortedCur, [...strMap.get(sortedCur), cur])
        } else {
            strMap.set(sortedCur, [cur])
        }
    }
    return Array.from(strMap.values())
}

解题思路

排序后的字符串作为 Map key,异位词排序后相同,自然分到一组。

  • 每个字符串 split → sort → join 得到 key
  • Map<key, string[]> 分组
  • 最后返回 Map.values()

复杂度

  • 时间:O(n × k log k),n 是字符串个数,k 是最长字符串长度(排序)
  • 空间:O(n × k),Map 存储