1- 思路
哈希表
- 1- 模式识别:字符串数组、异位词分组
- 2- 思路
- 2.1 哈希表:
- ① 哈希数组 :记录单字符串的哈希值
- ② HashMap<String,List>:收集结果
- 2.2 构造Key:key 的构造要依赖于 哈希数组
- 2.3 根据 Key 更新:根据 哈希数组 利用
StringBuilder
构造 Key
2- 实现
⭐49. 字母异位词分组——题解思路
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,List<String>> hm = new HashMap<>();
for(String str:strs){
int[] hash = new int[26];
for(int i = 0; i < str.length();i++){
hash[str.charAt(i)-'a']++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < 26;i++){
if(hash[i]!=0){
sb.append((char)i+'a');
sb.append(hash[i]);
}
}
String key = sb.toString();
List<String> List= hm.getOrDefault(key,new ArrayList<>());
List.add(str);
hm.put(key,List);
}
return new ArrayList<List<String>>(hm.values());
}
}
3- ACM 实现
public class groupAnagrams {
public static List<List<String>> groupAnagrams(List<String> strs){
HashMap<String,List<String>> hm = new HashMap<>();
for(String str:strs){
int[] hash = new int[26];
for(int i = 0 ; i < str.length();i++){
hash[str.charAt(i)-'a']++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < 26;i++){
if(hash[i]!=0){
sb.append((char) i-'a');
sb.append(hash[i]);
}
}
String key = sb.toString();
List<String> list = hm.getOrDefault(key,new ArrayList<>());
list.add(str);
hm.put(key,list);
}
return new ArrayList<List<String>>(hm.values());
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<String> list = new ArrayList<>();
System.out.println("输入字符串个数");
int n = sc.nextInt();
String s = sc.nextLine();
for(int i = 0 ; i < n;i++){
list.add(sc.nextLine());
}
System.out.println("结果是"+groupAnagrams(list));
}
}