Swift教室 Swift と競技プログラミングの教室

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 の並び順は不定です。テストコードは各グループと全体をソートしてから比較します。
模範解答
Swift
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 です)。