LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】
题目描述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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)。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
res = []
mapping = {}
for s in strs:
key = str(sorted(s))
mapping[key] = mapping.get(key, []) + [s]
for key, value in mapping.items():
res.append(value)
return res
时间复杂度:O(n)
空间复杂度:O(n)
解题思路二:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
table = collections.defaultdict(list)
for s in strs:
key = "".join(sorted(s))
table[key].append(s)
return list(table.values())
时间复杂度:O(nk logk)
空间复杂度:O(nk) 其中 n 是strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。
解题思路三:用字符计数数组作为哈希表的key。注意将数组转为tuple因为数组不可作为哈希表的key。
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())
时间复杂度:O(nk)
空间复杂度:O(nk)