这里写目录标题
- 49. 字母异位词分组
- 排序
- 计数
49. 字母异位词分组
每类异位词可以用哈希表存储。
哈希表的键:异位词的标志。
哈希表的值:异位词的列表。
遍历每个字符串,匹配(一个字符串是否对应于一个异位词的列表(1排序)(2计数))其对应的标志(哈希表的键)并将该字符串加入到这个标志的列表中(标志的首个字符串要创建标志的列表)。
遍历完所有字符串,哈希表的键对应所有的异位词。
排序
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创建一个 HashMap,用来存储排序后的字符串作为键(key),以及对应的原始字符串列表作为值(value)。
Map<String,List<String>>map = new HashMap<String,List<String>>();
for(String str:strs){
//对于每个字符串,将其转换为字符数组 array,然后使用 Arrays.sort() 方法对字符进行排序。
char[] array = str.toCharArray();
Arrays.sort(array);
//将排序后的字符数组转换回字符串 key。
String key = new String(array);
//使用 getOrDefault 方法从 map 中获取与 key 对应的列表,如果不存在则创建一个新的列表。
List<String> list = map.getOrDefault(key,new ArrayList<String>());
//将原始字符串 str 添加到列表中。
list.add(str);
//将更新后的列表放回 map 中。
map.put(key,list);
}
//最后,通过 map.values() 获取所有的列表,并将它们转换为 ArrayList,然后返回。
return new ArrayList<List<String>>(map.values());
}
}
计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的。
可以将每个字母出现的次数使用字符串表示,作为哈希表的键。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<String,List<String>>();
//定义一个26字母的数组,统计每个字母的个数。
for(String str:strs){
int[] counts = new int[26];
int length = str.length();
for(int i=0;i<length;i++){
counts[str.charAt(i)-'a']++;
}
// 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
StringBuffer sb = new StringBuffer();
for (int i=0; i<26; i++){
if(counts[i] !=0) {
sb.append((char)('a'+i));
sb.append(counts[i]);
}
}
//将排序后的字符数组转换回字符串 key。
String key = sb.toString();
//使用 getOrDefault 方法从 map 中获取与 key 对应的列表,如果不存在则创建一个新的列表。
List<String> list = map.getOrDefault(key,new ArrayList<String>());
//将原始字符串 str 添加到列表中。
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}