昨晚做了 49. 这一题,实际上这题没有什么特别的想法。参考 Solution 实现的。
不过思路是很值得了解,学习的。
所以写成博客稍微记录一下。
Q
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
之后,四行就缩减成了一行:
注:在写代码的时候,
collections
要提前导入!
所以多熟悉 python 标准库还是相当不错的。
defaultdict
的 Python Doc 例子:
总结
本题的 solution 将原本字符串排列组合问题替换成了比较字符串相等,甚至考虑排序后生成 hash 来比较。
确实是一种值得学习的思路。