题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
- 1 <= strs.length <= 104
- 0 <= strs[i].length <= 100
- strs[i] 仅包含小写字母
答案
方法一:哈希表
- 遍历字符串,对每个字符串按照字符字典序排序,得到一个新的字符串。
- 以新字符串为 key,[str] 为 value,存入哈希表当中(HashMap<String, List>)。
- 后续遍历得到相同 key 时,将其加入到对应的 value 当中即可。
以 strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 为例,遍历结束时,哈希表的状况:
key | value |
---|---|
“aet” | [“eat”, “tea”, “ate”] |
“ant” | [“tan”, “nat”] |
“abt” | [“bat”] |
最后返回哈希表的 value 列表即可。
时间复杂度 O(n×k×logk)。其中 n 和 k 分别是字符串数组的长度和字符串的最大长度。
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
d = defaultdict(list)
for s in strs:
k = ''.join(sorted(s))
d[k].append(s)
return list(d.values())
方法二:计数
我们也可以将方法一中的排序部分改为计数,也就是说,将每个字符串 s 中的字符以及出现的次数作为 key,将字符串 s 作为 value 存入哈希表当中。
时间复杂度 O(n×(k+C))。其中 n 和 k 分别是字符串数组的长度和字符串的最大长度,而 C 是字符集的大小,本题中 C=26。
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
d = defaultdict(list)
for s in strs:
cnt = [0] * 26
for c in s:
cnt[ord(c) - ord('a')] += 1
d[tuple(cnt)].append(s)
return list(d.values())