題目#
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。
解法#
- 創建一個 HashMap,key 是排序後的字串,value 是具有相同字母組成的字串列表
- 遍歷每個字串,將其排序後作為 key
- 如果 key 不存在,創建新的列表;如果存在,將字串加入對應的列表
- 返回 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),需要存儲所有字串的內容

