问题描述:49. 字母异位词分组
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的所有字母得到的一个新单词。
解题思路:
分析:字母异位词就是相同的字母按不同顺序组成的字符串,重点是如何判断字母异位词?
- 字母异位词是由相同的字母组成的。当需要查询元素是否出现过或元素是否在集合里时,首先考虑哈希法。
- 对于每个字符串,我们将其转换为字符数组,并对字符数组进行排序。然后,将排序后的字符数组转换回字符串,并将该字符串作为键存储在哈希表中。该键对应的值是一个列表,用于存储与该键对应的所有字母异位词。如果该键不存在,则创建一个新的列表并将其与该键关联起来;否则,直接从哈希表中获取该键对应的列表。
- 最后,我们将哈希表中的值转换为一个列表,并返回该列表作为结果。
整个过程可以通过以下几个步骤来概括:
- 创建一个空的哈希表 map。
- 遍历给定的字符串数组 strs,对于每个字符串 str:
- 将字符串 str 转换为字符数组 c。
- 对字符数组 c 进行排序。
- 将排序后的字符数组转换回字符串 key。
- 如果哈希表 map 中不包含键 key,则创建一个新的列表 list 并将其与键 key 关联;否则,直接从哈希表中获取键 key 对应的列表 list。
- 将字符串 str 添加到列表 list 中。
- 将哈希表 map 中的值转换为一个列表,并返回该列表作为结果。
代码示例:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> map = new HashMap<>();
//key用来存放排序过的字符串,list存放key对应的字母异位词
for(String str : strs){
char[] c = str.toCharArray();//转换为字符数组
Arrays.sort(c);//排序
String key = String.valueOf(c);//将排序后的字符数组转换回字符串,用于后续查找
List<String> list;
if(!map.containsKey(key)) list = new ArrayList<>();//不存在该key值,没有找到字母异位词,新建一个list
else list = map.get(key);//如果存在该key值,返回value
//可以用一句代码来实现 list = map.getOrDefalut(key, new ArrayList<>());
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}
补充与总结:
补充一点map的用法:
- map.getOrDefalut(key, new ArrayList<>());
- map.getOrDefault(key, default) 是 Java 中 Map 接口提供的方法,用于获取指定键对应的值。如果该键存在,则返回与之关联的值;如果该键不存在,则返回指定的默认值。
- 在这个例子中,map.getOrDefault(key, new ArrayList<>()) 的作用是:
如果哈希表 map 中存在键 key,则返回与之关联的值(即存放字母异位词的列表)。
如果哈希表 map 中不存在键 key,则返回一个新建的空列表 new ArrayList<>() 作为默认值。
- new ArrayList<List>(map.values())
- 该句的作用是将哈希表 map 中所有的值(即存放字母异位词的列表)提取出来,并存储到一个新的 ArrayList 中,作为返回结果。
- 首先,map.values() 返回一个包含所有值的 Collection 视图。其次我们使用 ArrayList 的构造函数来创建一个新的 ArrayList,并将 map.values() 返回的 Collection 视图作为参数传递进去。这样就会创建一个包含 HashMap 中所有值的新的 ArrayList 对象。
- 可以先做一下leetcode 242. 有效的字母异位词.