排序法:
java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
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);
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}
上面的Java代码定义了一个Solution
类,其中包含一个名为groupAnagrams
的公共方法。这个方法的目标是将一个字符串数组strs
中的字符串按照它们的字母顺序(即它们的字母异位词)进行分组。
以下是对代码的详细分析:
-
初始化:
- 首先,代码初始化了一个
HashMap
,键是排序后的字符串(作为字母异位词的标识),值是一个字符串列表,包含所有与该键匹配的原始字符串。
- 首先,代码初始化了一个
java
Map<String, List<String>> map = new HashMap<String, List<String>>();
-
遍历字符串数组:
- 对于
strs
数组中的每个字符串str
,代码执行以下操作:
- 对于
java
for (String str : strs) {
-
转换并排序字符串:
- 将字符串转换为字符数组。
- 使用
Arrays.sort
方法对字符数组进行排序。 - 使用排序后的字符数组创建一个新的字符串
key
,该字符串将作为HashMap
的键。
java
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
-
获取或创建列表:
- 使用
map.getOrDefault
方法尝试从HashMap
中获取与key
关联的列表。 - 如果
key
不存在,则使用new ArrayList<String>()
创建一个新的空列表。
- 使用
java
List<String> list = map.getOrDefault(key, new ArrayList<String>());
-
添加字符串到列表:
- 将原始的未排序的字符串
str
添加到获取到的列表list
中。
- 将原始的未排序的字符串
java
list.add(str);
-
更新
HashMap
:- 使用
map.put
方法将更新后的列表(现在包含了一个新的字符串)与key
关联起来。
- 使用
java
map.put(key, list);
-
返回结果:
- 最后,代码从
HashMap
中获取所有的值(即所有分组后的字符串列表),并将它们放入一个新的ArrayList
中,然后返回这个ArrayList
。
- 最后,代码从
java
return new ArrayList<List<String>>(map.values());
总结:
这个groupAnagrams
方法的核心思想是将字符串转换为它们的字母顺序形式,然后使用这些排序后的字符串作为键来将原始字符串分组。由于字母异位词在排序后将具有相同的字符串表示形式,因此它们将被分组到同一个列表中。这种方法可以有效地将字母异位词分组,并且对于较大的输入数据集也能保持良好的性能。