快轉到主要內容
leetcode 49 - Group Anagrams

leetcode 49 - Group Anagrams

·
類別 
Leetcode
標籤 
Java Leetcode Medium HashMap Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 49 - Group Anagrams (題目說明請點連結)

題目簡述
#

給一個字串陣列 strs,將具有相同字母組成的字串分組在一起。
字謎(Anagram)是指重新排列字母後能形成另一個字串的詞。

範例
#

Example 1:

Input: strs = ["eat","tea","tan","ate","nat","bat"]
Output: [["bat"],["nat","tan"],["ate","eat","tea"]]

Example 2:

Input: strs = [""]
Output: [[""]]

Example 3:

Input: strs = ["a"]
Output: [["a"]]

解題思路
#

這題要求我們將具有相同字母組成的字串分組在一起。我們可以使用 HashMap 來解決這個問題,將排序後的字串作為 key,原始字串作為 value。

解法
#

  1. 創建一個 HashMap,key 是排序後的字串,value 是具有相同字母組成的字串列表
  2. 遍歷每個字串,將其排序後作為 key
  3. 如果 key 不存在,創建新的列表;如果存在,將字串加入對應的列表
  4. 返回 HashMap 中所有的 value 列表

步驟
#

  • 初始化 HashMap:
    • 創建 Map<String, List<String>> 用於存儲分組結果
  • 遍歷字串陣列:
    • 對每個字串進行排序,生成 key
    • 檢查 key 是否存在,不存在則創建新列表
    • 將原始字串加入對應的列表
  • 返回結果:
    • 返回 HashMap 中所有的 value 列表

例子說明
#

strs = ["eat","tea","tan","ate","nat","bat"]

字串排序後Key分組結果
“eat”“aet”“aet”[“eat”]
“tea”“aet”“aet”[“eat”, “tea”]
“tan”“ant”“ant”[“tan”]
“ate”“aet”“aet”[“eat”, “tea”, “ate”]
“nat”“ant”“ant”[“tan”, “nat”]
“bat”“abt”“abt”[“bat”]

最終分組結果:

  • ["bat"] (key: “abt”)
  • ["tan", "nat"] (key: “ant”)
  • ["ate", "eat", "tea"] (key: “aet”)

完整程式碼
#

java
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap();
        
        for (String str : strs) {
            // 將字串轉換為字元陣列並排序
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);

            // 如果 key 不存在,創建新的列表
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }

            // 將原始字串加入對應的列表
            map.get(key).add(str);
        }

        // 返回 HashMap 中所有的 value 列表
        return new ArrayList<>(map.values());
    }
}

時間複雜度
#

  • 時間複雜度O(n × k × log k),其中 n 是字串陣列的長度,k 是最長字串的長度
    • 需要遍歷 n 個字串
    • 每個字串需要排序,時間複雜度為 O(k × log k)
  • 空間複雜度O(n × k),需要存儲所有字串的內容

相關文章

leetcode 105 - Construct Binary Tree from Preorder and Inorder Traversal
類別 
Leetcode
標籤 
Java Leetcode Medium Tree Problem Blind75
leetcode 19 - Remove Nth Node From End of List
類別 
Leetcode
標籤 
Java Leetcode Medium Linked List Problem Blind75
leetcode 211 - Design Add and Search Words Data Structure
類別 
Leetcode
標籤 
Java Leetcode Medium Blind75