【LeetCode】LeetCode 记录贴--字母异位词分组题
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 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"]
提示:
1 <= strs.length <= 104
0 <= strsi.length <= 100
strsi 仅包含小写字母
我的解题方法:
我的解题思路:
使用哈希表记录异位词,那么区分字母异位词的方式有两种:
-
将单词字母排序,所有异位词排序后的结果是一样的
-
统计单词出现次数,所有异位词的单词出现次数是一样的,将结果转化为一个字符串作为键值
复杂度
- 时间复杂度: 𝑂(𝑛𝑘),𝑘 是字符串长度,排序的话𝑂(𝑛𝑘𝑙𝑜𝑔𝐾)
- 空间复杂度: 𝑂(𝑛𝑘), 𝑛个字符串,每个字符串长度为𝑘,一共占据哈希表
𝑂(𝑛𝑘)个空间
解题代码:
typescript
function groupAnagrams(strs: string[]): string[][] {
const words = new Map<string, string[]>();
strs.map((str) => {
const arr = Array.from(str);
arr.sort();
const newStr = arr.toString();
let anagrams = words.get(newStr);
if (!anagrams) {
anagrams = [str];
words.set(newStr, anagrams);
} else {
anagrams.push(str);
}
});
return [...words.values()];
};