瀏覽代碼

#feat:leetcode p49题题解

yangyi 2 周之前
父節點
當前提交
c6df340a22
共有 2 個文件被更改,包括 92 次插入0 次删除
  1. 69 0
      src/leetcode/p49/Solution.java
  2. 23 0
      src/leetcode/p49/SolutionTest.java

+ 69 - 0
src/leetcode/p49/Solution.java

@@ -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());
+    }
+}

+ 23 - 0
src/leetcode/p49/SolutionTest.java

@@ -0,0 +1,23 @@
+package leetcode.p49;
+
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * @ProjectName: LeetCode
+ * @FileName: SolutionTest
+ * @Author: 杨逸
+ * @Data:2025/12/5 21:52
+ * @Description: 
+ */
+public class SolutionTest {
+
+    @Test
+    public void groupAnagrams() {
+        Solution solution = new Solution();
+        String[] strings = {"eat", "tea", "tan", "ate", "nat", "bat"};
+        List<List<String>> lists = solution.groupAnagrams(strings);
+        lists.forEach(System.out::println);
+    }
+}