编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ]
分析: 遍历字符串数组,通过哈希字典用来存储变位词,key值可以用词排序后的结果,value是一个list,用来存储变位词,排序的时间复杂度为 O ( k l o g k ) O(klogk) O(klogk), 其中k是词的长度,因此总体时间复杂度为 O ( n ∗ k l o g ( k ) O(n*klog(k) O(n∗klog(k)
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
words_map = {}
for i in range(len(strs)):
word = ''.join(sorted(strs[i]))
if word not in words_map:
words_map[word] = [strs[i]]
else:
words_map[word].append(strs[i])
return list(words_map.values())
当然,也可以创建一个26位长度数组,数组中的每一个位置记录一个单词中对应字母出现的频次,以此数组作为字典中的key值(Python中需要转化为元组,才能作为字典中的key值),变位词作为value, 省去了对单词的排序过程,时间复杂度 O ( n ∗ k ) O(n*k) O(n∗k)
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
words_map = {}
for i in range(len(strs)):
count = [0]*26
for c in strs[i]:
count[ord(c)-ord('a')] += 1
if tuple(count) not in words_map:
words_map[tuple(count)] = [strs[i]]
else:
words_map[tuple(count)].append(strs[i])
return list(words_map.values())



