LeetCodeHot100-49-字母异位词分组

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

1
2
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

1
2
输入: strs = [""]
输出: [[""]]

示例 3:

1
2
输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

题解

Python

这一题的话,思路和上一题是差不多的。

我们不可能计算出所有的字母异位词,一个可行的方案是,无论什么长度的字母异位词,它们的字母排序后一定是一致的,那么借助这个思想,先把字符串进行排序,如果得到一样的 sorted_str,那么它们就是字母异位词。

这里就自然而然想到使用哈希表进行数据的存储,这个哈希表的结构应该为:排序后的字符串-出现过的字母异位词列表。

那么我们只需要一次遍历,同样使用 enumerate() 方法方便获取下标和元素,对于当前的字符串进行排序,使用的是 sorted() 方法,该方法可以对任何可以迭代的对象进行排序,十分强大。然后排序的结果是一个 list,因此还需要把这个列表进行组合为一个字符串,使用 ''.join() 方法,这个方法可以将可迭代对象(如列表、元组、字符串等)中的元素合并成一个单一的字符串,也是十分强大的。

然后进行判断就好啦,如果排序后的字符串在哈希表中,那么把当前字符串放到该位置的后面,调用 append() 方法把数据添加到对应 list 的末尾;如果不在,那么就新添加进去就好,记得数据类型是一个列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
# 设置一个哈希表保存一些字母可能的字符串组合, 格式为: "aet":["eat", "tae"]
# 遍历每个元素, 把该元素里的字母按照字母顺序排序, 看看是否在哈希表里, 如果在, 添加到指定位置;
# 不在, 就把当前元素作为新的数据插入进去
str_map = dict()
for index, str in enumerate(strs):
sorted_str = ''.join(sorted(str))
if sorted_str in str_map:
str_map[sorted_str].append(str)
else:
str_map[sorted_str] = [str]

return list(str_map.values());
运行结果

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// map存放排序后的String与字母异位词列表
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String str : strs) {
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
// map.getOrDefault(Object key, V defaultValue)
// key - 键
// defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值
List<String> list = map.getOrDefault(key, new ArrayList<String>());
// 将当前的strs加入进去,temp可能空,可能非空
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}

LeetCodeHot100-49-字母异位词分组
https://excelius.xyz/leetcodehot100-49-字母异位词分组/
作者
Excelius
发布于
2024年12月27日
许可协议