力扣算法Hot100——49. 字母异位词分组
异位词的题,都考虑计算 26 个字母出现的数量,然后进行比较,字母数量出现相同的一定是异位词。
- 外层循环循环字符串数组中的每一个字符串,在内层进行其他操作
- 内层首先计算字符串的 26 个字母的出现的数量,并用一个数组存储
- 将数组中不为 0 的代表的字符拼接在一起,作为哈希表的键
- put 操作
- 返回字符串数组,内容为哈希表的值
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
// 哈希表,存储最终的结果,其值就是结果
Map<String, List<String>> map = new HashMap();
// 遍历strs
for(String str : strs){
// 创建数组记录str中每个字母的数量
int[] counts = new int[26];
for(int i = 0; i < str.length(); i++){
counts[str.charAt(i) - 'a']++;
}
// 创建可变字符串保存counts中拼接后的字符串
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 26; i++){
if(counts[i] != 0){
sb.append(i + 'a');
sb.append(counts[i]);
}
}
// 转换为普通的字符串
String key = sb.toString();
// 从 map 中获取指定 key 对应的 List<String>,如果 key 不存在,则返回一个新的空 ArrayList<String> 作为默认值。
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}