100道面试必会算法-31-字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解题思路
遍历字符串数组
strs
,对每个字符串进行处理:
- 将字符串转换为字符数组并进行排序。
- 将排序后的字符数组转换为字符串,作为键。
- 将原始字符串作为值,存储在相应键的列表中。
最终将所有的值(即分组好的字母异位词列表)转换为 ArrayList
并返回。
代码
class Solution {// 定义一个方法用于对字符串数组中的字符串进行分组public List<List<String>> groupAnagrams(String[] strs) {// 创建一个新的列表,其中包含根据相同字符组成的字符串对字符串数组进行分组的结果return new ArrayList<>(Arrays.stream(strs).collect(Collectors.groupingBy(str->{// 将字符串转换为字符数组,并对字符数组进行排序char[] array=str.toCharArray();Arrays.sort(array);return new String(array);})).values());}
}
详细步骤
-
转换为流:
Arrays.stream(strs)
将字符串数组
strs
转换为一个流(Stream),以便使用流的操作来处理数据。 -
分组操作:
Collectors.groupingBy(str -> {char[] array = str.toCharArray();Arrays.sort(array);return new String(array); })
使用
Collectors.groupingBy
将字符串按照排序后的字符数组进行分组。具体步骤如下:- 将字符串转换为字符数组
char[] array = str.toCharArray();
。 - 对字符数组进行排序
Arrays.sort(array);
。 - 将排序后的字符数组转换回字符串
return new String(array);
,作为分组的键。
- 将字符串转换为字符数组
-
转换为列表:
new ArrayList<>(...values())
最后,将分组后的值(即字母异位词列表)转换为
ArrayList
,并返回结果。
优点
- 简洁性:使用 Java Stream API 和 Collectors 使代码简洁明了。
- 效率:排序操作的时间复杂度为 O(n log n),遍历和分组操作的时间复杂度为 O(n),总体来说效率较高。
总结
通过对字符串排序并利用 Map
进行分组,巧妙地将字母异位词归为一类。最终,使用 Java Stream API 将结果整理为所需的列表形式,代码简洁高效,适用于大多数情况下的字母异位词分组问题。