本篇博客介绍了力扣经典150题中的第四十二题:字母异位词分组。题目要求将给定的字符串数组中的字母异位词分组,并返回分组结果。
给定一个字符串数组 strs
,将其中字母异位词(由重新排列源单词的所有字母得到的新单词)组合在一起,最终返回分组后的结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
要将字母异位词分组,可以使用哈希表进行处理:
map
,键为字符串的字符排序后的字符串(作为异位词的标识),值为该异位词所在的分组列表。strs
,对于每个字符串 s
:
s
转换成字符数组,并进行排序得到新的字符串 sortedStr
,作为哈希表的键。sortedStr
在哈希表中不存在,创建一个新的分组列表,并将当前字符串 s
加入到列表中,同时在哈希表中添加 sortedStr
到对应的分组列表。sortedStr
在哈希表中存在,直接将当前字符串 s
加入到对应的分组列表中。通过上述步骤,可以将字母异位词分组并返回结果列表。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupAnagrams {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
// 将字符串转换成字符数组并排序
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
String sortedStr = new String(charArray);
// 如果 sortedStr 不在 map 中,创建一个新的分组列表
if (!map.containsKey(sortedStr)) {
map.put(sortedStr, new ArrayList<>());
}
// 将当前字符串加入到对应的分组列表中
map.get(sortedStr).add(s);
}
// 返回哈希表中的所有分组列表
return new ArrayList<>(map.values());
}
public static void main(String[] args) {
GroupAnagrams solution = new GroupAnagrams();
// 示例测试
String[] strs1 = {"eat", "tea", "tan", "ate", "nat", "bat"};
System.out.println("输入: " + Arrays.toString(strs1));
System.out.println("输出: " + solution.groupAnagrams(strs1));
String[] strs2 = {""};
System.out.println("输入: " + Arrays.toString(strs2));
System.out.println("输出: " + solution.groupAnagrams(strs2));
String[] strs3 = {"a"};
System.out.println("输入: " + Arrays.toString(strs3));
System.out.println("输出: " + solution.groupAnagrams(strs3));
}
}
展示了几个不同的示例测试,验证了字母异位词分组的功能。
该解法的时间复杂度为 O(n * k log k),其中 n 是字符串数组 strs
的长度,k 是字符串的最大长度。空间复杂度为 O(n * k),主要是哈希表 map
存储的空间。