该题用哈希表解答,具有统一特征的作为哈希表的键名,然后满足要求的作为值
解法一:
我们将每个字符串进行排序,如果排序后的结果相同,则可以认为是字母异位词,我们将排序后的结果作为哈希表的key,然后满足要求的作为value。
最后结果返回以list格式的哈希表的value,既可满足题目要求。。
import collections
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mp=collections.defaultdict(list)
for str in strs:
mp[''.join(sorted(str))].append(str)
return list(mp.values())
解法二:
字母异位词的每个词中的每个字母出现的次数一定是一样的,我们将字母出现次数的列表作为哈希表的key把符合要求的作为value即可。
因为都是小写字母,我们初始化一个26大小全为0的数组,并且遍历整个字符串,把字母的次数加上对应的字母位置上。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mp = collections.defaultdict(list)
for st in strs:
counts = [0] * 26
for ch in st:
counts[ord(ch) - ord("a")] += 1
# 需要将 list 转换成 tuple 才能进行哈希
mp[tuple(counts)].append(st)
return list(mp.values())
ord('b')-ord('a)=1故在数组的第一个位置+1。
ord('a')-ord('a)=0故在数组的第0个位置+1。
这样就刚好对应上了字母表的顺序。
返回的时候要把key转换为tuple才行,如果是列表的话会报错。