Leetcode[哈希] 字母异位词分组

0 题目描述

leetcode原题链接:字母异位词分组
在这里插入图片描述

1 哈希算法

当且仅当它们的排序字符串相等时,两个字符串是字母异位词。
算法:
维护一个映射 dicts : {String -> List},其中每个键 K K K 是一个排序字符串,每个值是初始输入的字符串列表,排序后等于 K K K
我们将键存储为字符串,例如,code。 在 Python 中,我们将键存储为散列化元组,例如,(‘c’, ‘o’, ‘d’, ‘e’)。

class Solution(object):
    def groupAnagrams(self, strs):
        dicts = collections.defaultdict(list)
        for s in strs:
            dicts[tuple(sorted(s))].append(s)
        return list(dicts.values())

复杂度分析
时间复杂度: O ( N K log ⁡ K ) O(NK \log K) O(NKlogK),其中 N N N 是 strs 的长度,而 K K K 是 strs 中字符串的最大长度。当我们遍历每个字符串时,外部循环具有的复杂度为 O ( N ) O(N) O(N)。然后,我们在 O ( K log ⁡ K ) O(K \log K) O(KlogK) 的时间内对每个字符串排序。
空间复杂度: O ( N K ) O(NK) O(NK),排序存储在 dicts 中的全部信息内容。

2 计数分类

当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。
算法:
我们可以将每个字符串strs 转换为字符数count,由26个非负整数组成,表示a,b,c 的数量等。我们使用这些计数作为哈希映射的基础。
在这里插入图片描述

class Solution:
    def groupAnagrams(self,strs):
        dicts = collections.defaultdict(list)
        for s in strs:
            count = [0] * 26
            for c in s:
                count[ord(c) - ord('a')] += 1
            dicts[tuple(count)].append(s)
        return list(dicts.values())

复杂度分析
时间复杂度: O ( N K ) O(NK) O(NK),其中 N N N 是 strs 的长度,而 K K K 是 strs 中字符串的最大长度。计算每个字符串的字符串大小是线性的,我们统计每个字符串。
空间复杂度: O ( N K ) O(NK) O(NK),排序存储在 dicts 中的全部信息内容。

参考资料

有效的字母异位词 – 哈希算法
字母异位词分组

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值