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

14. Unique Email Addresses

読了目安 約1分

HashMap / LeetCode 929 (Easy) — 正規化したアドレスを集合に集めて宛先の種類を数える。

この章の目次

問題

LeetCode 929. Unique Email Addresses(Easy / カテゴリ: HashMap)

メールアドレスの配列 emails が与えられます。 @ より前をローカル名と呼び、その中の . は無視され、+ から後ろもすべて無視されます。 @ より後ろのドメイン名はそのまま使われます。 このルールで解釈したとき、実際の宛先が何種類になるかを返します。

考え方

ヒント 1

各アドレスをルール通りに変換して、正規化した文字列を作ります。

ヒント 2

正規化した文字列を集合(Set)に入れていけば、最後の要素数が答えです。

Swift 実装のポイント

  • split(separator: "@") でローカル名とドメイン名に分けます。要素は Substring 型です。
  • + 以降の切り捨ては、firstIndex(of: "+") で位置を探し、範囲 local[..<plus] で取り出します。
  • . の除去は filter { $0 != "." } で書けます。
  • 組み立て直しは文字列補間 "\(name)@\(parts[1])" にすると、SubstringString の型変換を意識せずに済みます。
模範解答
Swift
class Solution {
    func numUniqueEmails(_ emails: [String]) -> Int {
        var seen = Set<String>()
        for email in emails {
            let parts = email.split(separator: "@")
            var local = parts[0]
            if let plus = local.firstIndex(of: "+") {
                local = local[..<plus]
            }
            let name = local.filter { $0 != "." }
            seen.insert("\(name)@\(parts[1])")
        }
        return seen.count
    }
}

計算量: O(総文字数)(各アドレスを 1 回ずつ走査して正規化します)。