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])"にすると、SubstringとStringの型変換を意識せずに済みます。
模範解答
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 回ずつ走査して正規化します)。