12. Group Anagrams
読了目安 約1分
HashMap / LeetCode 49 (Medium) — ソートした文字列をキーにしてアナグラムをまとめる。
この章の目次
問題
LeetCode 49. Group Anagrams(Medium / カテゴリ: HashMap)
文字列の配列 strs が与えられます。
アナグラムは、文字を並べ替えると互いに一致する単語の組です。
アナグラムどうしをグループにまとめ、グループの配列として返します。
グループの順序も、グループ内の単語の順序も自由です。
考え方
ヒント 1
2 つの単語がアナグラムかどうかは、それぞれの文字をソートして比べれば分かります。 ソート結果が同じなら仲間です。
ヒント 2
ソート済みの文字列をキー、単語の配列を値にする辞書を作ります。 各単語を自分のキーの配列に追加していけば、値の一覧がそのまま答えです。
Swift 実装のポイント
s.sorted()は[Character]を返します。キーにするにはString(s.sorted())で文字列に戻します。groups[key, default: []].append(s)で、キーが未登録のときの初期化を 1 行にまとめられます。- 辞書の
valuesの並び順は不定です。テストコードは各グループと全体をソートしてから比較します。
模範解答
class Solution {
func groupAnagrams(_ strs: [String]) -> [[String]] {
var groups: [String: [String]] = [:] // ソート済み文字列 → アナグラムの仲間
for s in strs {
let key = String(s.sorted())
groups[key, default: []].append(s)
}
return Array(groups.values)
}
}計算量: O(nk log k)(n は単語数、k は単語の最大長。各単語のソートが k log k です)。