题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词:通过重新排列源单词的所有字母得到的新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解释:
在 strs 中没有字符串可以通过重新排列来形成 "bat"。
字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。示例 2:
输入: strs = [""]
输出: [[""]]示例 3:
输入: strs = ["a"]
输出: [["a"]]提示
一句话思路:互为异位词的两个字符串,把字母排序后一定得到相同的结果,用它作为哈希表的 key 来分组。
- 把每个字符串
s排序得到sorted_s,作为分组键,值存一个列表装原始字符串。 - 最终答案就是哈希表中所有 value 组成的列表。
- 时间复杂度 O(n·k·logk),n 是字符串个数,k 是最长字符串长度(排序开销)。
答案
python
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
d = {} # 哈希表:分组键 -> 该组的字符串列表
for s in strs: # 遍历每个字符串
sorted_s = ''.join(sorted(s)) # 排序后的字符串,互为异位词结果相同
if sorted_s not in d: # 分组键还不存在,先建一个空列表
d[sorted_s] = []
d[sorted_s].append(s) # 把原字符串加入对应分组
return list(d.values()) # 取出所有分组列表作为结果
留言板