49. 字母异位词分组

题目地址(49. 字母异位词分组)

https://leetcode-cn.com/problems/group-anagrams/

题目描述

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

 

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

前置知识

  • hashmap

代码

  • 语言支持:Python

Python Code:


class Solution(object):
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: List[List[str]]
        """
        # str_dict = {} # 不可以
        str_dict = collections.defaultdict(list)

        for s in strs:
            s_key = [0] * 26
            for c in s:
                s_key[ord(c) - ord('a')] += 1

            str_dict[tuple(s_key)].append(s)    # key对应对个值
        return str_dict.values()


# 更好的编码方案是利用每个字符的出现次数进行编码

# 我们建立一个 26 长度的 counts 数组(如果区分大小写,我们可以建立 52 个,如果支持其他字符依次类推)。 
# 然后我们给每一个字符一个固定的数组下标,然后我们只需要更新每个字符出现的次数。
# 最后形成的 counts 数组如果一致,则说明他们可以通过 交换顺序得到。
# 算法空间复杂度 O(n), 时间复杂度 O(n * k), n 为数组长度,k 为字符串的平均长度

# https://github.com/azl397985856/leetcode/blob/master/problems/49.group-anagrams.md

        # """
        # 思路同上,在Python中,这里涉及到3个知识点:
        # 1. 使用内置的 defaultdict 字典设置默认值;
        # 2. 内置的 ord 函数,计算ASCII值(等于chr)或Unicode值(等于unichr);
        # 3. 列表不可哈希,不能作为字典的键,因此这里转为元组;
        # """

复杂度分析

posted @ 2022-05-02 20:35  麦克斯的园丁  阅读(70)  评论(0编辑  收藏  举报