【LeetCode】LeetCode 记录贴--字母异位词分组

【LeetCode】LeetCode 记录贴--字母异位词分组题

题目

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

示例 1

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

在 strs 中没有字符串可以通过重新排列来形成 "bat"。

字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。

字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入: strs = ""
输出: \[""]

示例 3:

输入: strs = "a"
输出: \["a"]

提示:

1 <= strs.length <= 104

0 <= strsi.length <= 100

strsi 仅包含小写字母

我的解题方法:

我的解题思路:

使用哈希表记录异位词,那么区分字母异位词的方式有两种:

  1. 将单词字母排序,所有异位词排序后的结果是一样的

  2. 统计单词出现次数,所有异位词的单词出现次数是一样的,将结果转化为一个字符串作为键值

复杂度

  • 时间复杂度: 𝑂(𝑛𝑘),𝑘 是字符串长度,排序的话𝑂(𝑛𝑘𝑙𝑜𝑔𝐾)
  • 空间复杂度: 𝑂(𝑛𝑘), 𝑛个字符串,每个字符串长度为𝑘,一共占据哈希表
    𝑂(𝑛𝑘)个空间

解题代码:

typescript 复制代码
function groupAnagrams(strs: string[]): string[][] {
    const words = new Map<string, string[]>();
    strs.map((str) => {
        const arr = Array.from(str);
        arr.sort();
        const newStr = arr.toString();
        let anagrams = words.get(newStr);
        if (!anagrams) {
            anagrams = [str];
            words.set(newStr, anagrams);
        } else {
            anagrams.push(str);
        }
    });
    return [...words.values()];
};