题目如下:
解题思路:
-
目标:
- 给定一组字符串,将字母相同但顺序不同的字符串放到一起。比如
"eat"
和"tea"
就是字母异位词(anagram),因为它们用的是相同的字母。
- 给定一组字符串,将字母相同但顺序不同的字符串放到一起。比如
-
步骤解释:
-
创建 HashMap:
Map<String, List<String>> map = new HashMap<>()
创建了一个字典(类似于单词本)。字典的**每个键(key)**将是字符串的"排序后版本"。比如"eat"
排序后变成"aet"
,所有字母异位词都会有相同的键。 -
遍历字符串:
for (String str : strs)
遍历输入的每个字符串,比如"eat"
、"tea"
。 -
字符排序:
char[] array = str.toCharArray(); Arrays.sort(array);
将字符串变成字符数组,然后对字符排序。排序后,像"eat"
会变成"aet"
,这样方便将它和其他字母异位词归到同一个组里。 -
存储结果:检查排序后的字符串是不是已经在 map 里面了。如果不在,先创建一个新的空列表来存储原始字符串;如果在,就直接把当前字符串加入到这个列表中。
-
返回结果:最后,将 map 里面所有的值(就是每个分组的字符串列表)收集起来,作为结果返回。
-
代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 创建一个 HashMap 来存储分组结果
Map<String, List<String>> map = new HashMap<>();
// 遍历每一个字符串
for (String str : strs) {
// 将字符串转换为字符数组
char[] array = str.toCharArray();
// 对字符数组进行排序
Arrays.sort(array);
// 将排序后的字符数组转换回字符串作为 key
String sortedStr = new String(array);
// 如果 map 中还没有这个 key,先创建一个空列表
if (!map.containsKey(sortedStr)) {
map.put(sortedStr, new ArrayList<>());
}
// 把原始字符串加入到对应的列表中
map.get(sortedStr).add(str);
}
// 返回所有的分组(map 的 values 是每个 key 对应的列表)
return new ArrayList<>(map.values());
}
}