題目說明
範例
Input: ["eat","tea","tan","ate","nat","bat"]
Output: [["eat","tea","ate"],["tan","nat"],["bat"]]
Input: [""]
Output: [[""]]
Input: ["a"]
Output: [["a"]]
程式碼
Python 解法
from collections import defaultdict
def groupAnagrams(strs):
ans = defaultdict(list)
for s in strs:
key = tuple(sorted(s))
ans[key].append(s)
return list(ans.values())
Java 解法
import java.util.*;
class Solution {
public List<List> groupAnagrams(String[] strs) {
Map<String, List> map = new HashMap<>();
for (String s : strs) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
String key = new String(chars);
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
map.get(key).add(s);
}
return new ArrayList<>(map.values());
}
}
Java vs Python 差異
• Python 用 defaultdict(list) 簡化初始化,Java 需手動判斷 key 是否存在
• Python 用 tuple(sorted(s)) 當 key,Java 先排序 char[] 再轉回 String
• 核心邏輯相同:排序後作為 key,將相同 key 的字串放入同一群組
複雜度分析
• 時間複雜度:O(n * k log k),n 是字串數量,k 是字串平均長度(排序每個字串 O(k log k))
• 空間複雜度:O(n * k),存放結果與映射