|
|
@@ -0,0 +1,69 @@
|
|
|
+package leetcode.p49;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @ProjectName: LeetCode
|
|
|
+ * @FileName: Solution
|
|
|
+ * @Author: 杨逸
|
|
|
+ * @Data:2025/12/5 21:45
|
|
|
+ * @Description: https://leetcode.cn/problems/group-anagrams/
|
|
|
+ * 49. 字母异位词分组
|
|
|
+ */
|
|
|
+class Solution {
|
|
|
+ public List<List<String>> groupAnagrams(String[] strs) {
|
|
|
+ //映射字符出现次数的列表
|
|
|
+ List<Map<Character,Integer>> characterMapList = new ArrayList<>();
|
|
|
+ //字符出现次数对应字符串列表的映射
|
|
|
+ Map<Map<Character,Integer>, List<String>> map = new HashMap<>();
|
|
|
+ for (String str : strs) {
|
|
|
+ //统计当前字符串字符出现的次数
|
|
|
+ Map<Character,Integer> characterMap = new HashMap<>();
|
|
|
+ for (char c : str.toCharArray()) {
|
|
|
+ Integer count = characterMap.getOrDefault(c, 0);
|
|
|
+ characterMap.put(c, count+1);
|
|
|
+ }
|
|
|
+ //遍历映射字符出现次数的列表
|
|
|
+ boolean flag = false;
|
|
|
+ for (Map<Character,Integer> characterIntegerMap : characterMapList) {
|
|
|
+ if (flag) {
|
|
|
+ //已成功找到
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //判断之前是否已经出现过相同字符频率的字符串(之前纯在异或的字符串)
|
|
|
+ if (characterIntegerMap.size()==characterMap.size()) {
|
|
|
+ boolean flag1 = true;
|
|
|
+ for (Character character : characterIntegerMap.keySet()) {
|
|
|
+ if (characterMap.containsKey(character) && characterMap.get(character).equals(characterIntegerMap.get(character))) {
|
|
|
+ //字符频率匹配,继续下一个字符
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //不匹配
|
|
|
+ flag1 = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //字符频率全匹配
|
|
|
+ if (flag1) {
|
|
|
+ //直接加入
|
|
|
+ map.getOrDefault(characterIntegerMap, new ArrayList<>()).add(str);
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //未出现过的字符频率(之前没有出现对应的异或字符串)
|
|
|
+ if (!flag){
|
|
|
+ characterMapList.add(characterMap);
|
|
|
+ //创建新的列表再加入
|
|
|
+ ArrayList<String> strings = new ArrayList<>();
|
|
|
+ strings.add(str);
|
|
|
+ map.put(characterMap, strings);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //最后返回所有相同字符频率的字符串列表
|
|
|
+ return map.values().stream().collect(Collectors.toList());
|
|
|
+ }
|
|
|
+}
|