***49. Group Anagrams 字母异位词分组
1. 原始题目
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
2. 思路
方法1:将字符串分别排序后判定是否是异位次
方法2:将字符串利用字母表计数后判定是否是异位次
3. 解题
首先复习几个知识点:
1)chr() 函数用一个整数作参数,返回值是当前整数对应的 ASCII 字符。
>>>chr(0x30) '0' >>> chr(97) 'a' >>> chr(8364) '€'
2) ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
>>>ord('a') 97 >>> ord('b') 98 >>> ord('c') 99
3)python字典get方法:
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
ict.get(key, default=None)
dict = {'Name': 'Zara', 'Age': 27}
print "Value : %s" % dict.get('Age')
print "Value : %s" % dict.get('Sex', "Never")
Value : 27
Value : Never
4)python字典 setdefault()方法
Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
dict = {'runoob': '菜鸟教程', 'google': 'Google 搜索'}
print "Value : %s" % dict.setdefault('runoob', None)
print "Value : %s" % dict.setdefault('Taobao', '淘宝')
Value : 菜鸟教程
Value : 淘宝
正式解题(several ways):
方法1:排序后的字符串作为键
1 class Solution(object):
2 def groupAnagrams(self, strs):
3 ans = collections.defaultdict(list) # 默认值为list
4 for s in strs:
5 ans[tuple(sorted(s))].append(s) # 注意字典的键必须为可哈希,所以应转为tuple
6 return list(ans.values())
1 class Solution:
2 def groupAnagrams(self, strs: 'List[str]') -> 'List[List[str]]':
3
4 ind = {}
5 for s in strs:
6 k = ''.join(sorted(s))
7 ind.setdefault(k, []).append(s)
8
9 return list(ind.values())
方法2:计数后的字符串作为键。利用26个小写字母计数。

1 class Solution:
2 def groupAnagrams(strs):
3 ans = collections.defaultdict(list)
4 for s in strs:
5 count = [0] * 26 # 26个字母分别计数,如果计数完全相同的两个字符串则视为异位词
6 for c in s:
7 count[ord(c) - ord('a')] += 1 # ord将字符转为整型
8 ans[tuple(count)].append(s)
9 return ans.values()

浙公网安备 33010602011771号