給定一個字串陣列 strs
,請將字母相同但排列順序不同的單字(即異位詞,Anagrams)分組。可以以任意順序返回結果。
輸入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]範例 2:
輸出: [["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
輸入: strs = [""]
輸出: [[""]]
範例 3:
輸入: strs = ["a"]
輸出: [["a"]]
strs[i]
只包含小寫英文字母異位詞(Anagrams)是指由相同字母組成,但字母排列順序不同的單字。因此,所有異位詞的特徵就是它們的字母組合相同。
解法的核心思路是:
defaultdict
)存儲這些異位詞,Key 為排序後的字串,Value 為原始字串的列表。from collections import defaultdict
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
anagrams = defaultdict(list)
for s in strs:
sorted_str = "".join(sorted(s)) # 排序字母後轉回字串
anagrams[sorted_str].append(s) # 加入對應的群組
return list(anagrams.values()) # 取出所有群組
strs
的長度,k 為字串平均長度。tuple
(長度 26,代表 a~z 的出現次數)。from collections import defaultdict
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
anagrams = defaultdict(list)
for s in strs:
count = [0] * 26 # 建立 26 個字母頻率陣列
for char in s:
count[ord(char) - ord('a')] += 1 # 計算每個字母出現次數
anagrams[tuple(count)].append(s) # 轉換為 tuple 作為 key
return list(anagrams.values()) # 取出所有群組
Counter
(Python 內建函式)Python 的 collections.Counter
可以直接計算字母頻率,類似於解法二。
from collections import defaultdict, Counter
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
anagrams = defaultdict(list)
for s in strs:
anagrams[frozenset(Counter(s).items())].append(s) # 使用 frozenset 作為 key
return list(anagrams.values())
Counter
)也是不錯的選擇。這題使用了雜湊表與字串處理,熟悉後可以應用在很多字串相關的題目上!