给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
我遇到的问题
如何解决乱序问题
它是什么
可以快速查找的工具
常见用法
找目标数,降低复杂度
我踩过的坑
类型使用错误,忽略sort和增强型for循环使用条件
总结
学校没教哈希很伤
下面看看代码
import java.util.*;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 创建哈希表
Map<String, List<String>> map = new HashMap<>();
// 增强型for循环
for (String str : strs) {
// 转换为字符数组(七七错误点:漏掉该步,导致后续错误,sort必须转换为字符数组才可以使用,而sort的从小到大排序是该方法的核心)
char[] chars = str.toCharArray();
// 运用sort方法进行排序(七七错误点:写成Array,array没有sort方法)
Arrays.sort(chars);
// 将排序后的字符数组转换成字符串
String key = new String(chars);
// 如果当前键(排序后的字符序列)尚未存在于哈希表中,则初始化一个空列表
map.putIfAbsent(key, new ArrayList<>());
// 将当前字符串归类到与其互为字母异位词的组中
map.get(key).add(str);
}
// 返回所有字母异位词的分组结果,每个分组包含具有相同字符组成的字符串列表
return new ArrayList<>(map.values());
}
}
那有没有更快的方法呢?有的
import java.util.*;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 创建哈希表用于存储分组结果
Map<String, List<String>> map = new HashMap<>();
// 遍历输入字符串数组
for (String str : strs) {
// 统计每个字符的出现次数
int[] count = new int[26];
// 通过toCharArray()方法将字符串转换为字符数组
for (char c : str.toCharArray()) {
// c - 'a':将字符 c 转换为相对于字母 'a' 的索引(如 'a' 对应 0,'b' 对应 1,以此类推)。
//count[c - 'a']++:对应字母的计数器加 1,以此统计每个字母在字符串中出现的次数。
count[c - 'a']++;
}
// 将字符统计数组转换为字符串作为键
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
// 判断当前字母的计数是否大于 0,大于 0 则将其添加到字符串中
if (count[i] > 0) {
// 输出字母和计数
sb.append('a' + i).append(count[i]);
}
}
// 转换为字符串
String key = sb.toString();
// 将当前字符串归类到与其互为字母异位词的组中
map.putIfAbsent(key, new ArrayList<>());
map.get(key).add(str);
}
// 返回所有字母异位词的分组结果
return new ArrayList<>(map.values());
}
}
这样子通过建链速度更快
