【Leetcode】49. Group Anagrams 笔记

Overview



昨晚做了 49. 这一题,实际上这题没有什么特别的想法。参考 Solution 实现的。
不过思路是很值得了解,学习的。
所以写成博客稍微记录一下。


Q

n/a



Solution

可以分组的字符串必然满足排序后相等
如:
e, a, t
a, t, e,
t, e, a

排序之后比较就是相等的。
排序后作为元组用作字典的键,
索引未加入的字符串(排序然后作为元组,与键比较- 即索引),加入索引到的值中(列表)。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        from collections import defaultdict
        _d = defaultdict(list)
        for _s in strs:
            _t = tuple(sorted(_s))
            _d[_t].append(_s)
        return list(_d.values())

python 中使用 使用 defaultdict – 列表 是为了当前这个待分组(即要与字典的键比较)的新字符串,如果原先字典中不存在 dict[new_one] 键值,那么 _d[_t].append(_s) 的写法就有问题。必须要先 _d[_t] = [_s, ] 才可以。
也就是:

try:
    _d[_t].append(_s)
except:
    _d[_t] = [_s, ]

当然这么写是可以的。不过使用了 defaultdict 之后,四行就缩减成了一行:

n/a

注:在写代码的时候,collections 要提前导入!

所以多熟悉 python 标准库还是相当不错的。

defaultdict 的 Python Doc 例子:
n/a



总结

本题的 solution 将原本字符串排列组合问题替换成了比较字符串相等,甚至考虑排序后生成 hash 来比较。
确实是一种值得学习的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值