#字母异位词分组*

🔗 LeetCode

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

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

示例 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] 仅包含小写字母

#解题思路

题目信息:任意顺序

#思路一

首先写一个判断字母异位词的函数,然后使用哈希缓存每个组,然后每次存哈希需要把每个 key 匹配一遍,复杂度 O(mnk)

#思路二

字符串排序后如果是异位词则相同,则复杂度减到 O(m nlogn) nlog(n)假定排序复杂度

#首次代码

function groupAnagrams(strs: string[]): string[][] {
  const groupMap: Record<string, string[]> = {}

  for (let i = 0; i < strs.length; i++) {
    const sorted = strSort(strs[i])
    if (groupMap[sorted]) {
      groupMap[sorted].push(strs[i])
    } else {
      groupMap[sorted] = [strs[i]]
    }
  }

  return Object.values(groupMap)
}

function strSort(s: string) {
  return s.split('').sort().join('')
}