哈希-字母异位词分组
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
输入:字符串数组strs
输出:二维列表
思路:计数法,使用有效的字母异位词对每一个字符串进行操作,得到
的整型数组进行比较,如果相同则表示是字母异位词,然后将其整合在一起,使用hash表键值映射,详细请看Java数据结构—HashMap(哈希表及其基本操作)(含hashset)
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//定义哈希表
Map<String,List<String>> map = new HashMap<>();
//循环strs
for(String str : strs){
//定义长度为26的整型数组用来存储每个字符出现的次数
int[] counts = new int[26];
//遍历字符串
for(char s : str.toCharArray()){
counts[s - 'a']++;
}
//拼接字符串,作为哈希表的键
StringBuilder sb = new StringBuilder();
for(int i = 0;i < 26;i++){
if(counts[i] != 0){
sb.append((char)('a' + i)).append(counts[i]);
}
}
//转换为String
String key = sb.toString();
//这个还在循环里面
List<String> list = map.getOrDefault(key,new ArrayList<>());
list.add(str);
//把键值对存入map
map.put(key,list);
}
//返回所有的哈希表中的值
return new ArrayList<>(map.values());
}
}
这里不能直接使用
return map.values();
Line 30: error: incompatible types: Collection<List<String>> cannot be converted to List<List<String>>
return map.values();
虽然 map.values() 返回的集合已经包含了所有值,但它是一个 Collection 类型,而不是 List 或 ArrayList。为了满足特定需求(如随机访问、封装性等),我们需要将其转换为 ArrayList。因此,代码中使用 new ArrayList<>(map.values())
是一种更安全、更灵活的做法。