From 650d6143cb9b61b20f5fcb5424a38fe3209a23b3 Mon Sep 17 00:00:00 2001 From: aiueoriku <112373068+aiueoriku@users.noreply.github.com> Date: Fri, 23 May 2025 12:05:16 +0900 Subject: [PATCH 1/3] Create Unique Email Addresses.md Problem: https://leetcode.com/problems/unique-email-addresses/description/ --- .../Unique Email Addresses.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Unique Email Addresses/Unique Email Addresses.md diff --git a/Unique Email Addresses/Unique Email Addresses.md b/Unique Email Addresses/Unique Email Addresses.md new file mode 100644 index 0000000..740c915 --- /dev/null +++ b/Unique Email Addresses/Unique Email Addresses.md @@ -0,0 +1,41 @@ +# Step1 +何も見ずに実行 +```python +class Solution: + def numUniqueEmails(self, emails: List[str]) -> int: + valid_emails = [] + for email in emails: + local, domain = email.split("@") + local = local.replace(".", "") + local = local.split("+")[0] + email = local+"@"+domain + if email not in valid_emails: + valid_emails.append(email) + return len(valid_emails) +``` +emailをlocalとdomainに分割し,ルールに従い,domainを実際に有効な形式に変換した.単純にリストにappendして数えたが,dictを使ったらより計算効率が上がるかもしれない. + +# Step2 +他の人の解答を参照する. +https://github.com/potrue/leetcode/pull/14/files#diff-6a8efe56493bdbfeb045b7aa123660406ebdd5dd4f0a011935562d4eefb9ab46 + +上記を見ると,概ね実装方針は同じだった.ただ,以下が参考になった. +- listの代わりにset()を使っていたこと.setは重複を排除する. +- @が含まれない場合も考慮して,partitionを使用していたこと.partitionは区切り文字も返す. + +また,RFC規格という存在を知った.https://info.yamap.com/archives/3434 + +# Step3 +他の人の解答を参考に解き直す +```python +class Solution: + def numUniqueEmails(self, emails: List[str]) -> int: + valid_emails = set() + for email in emails: + local, at, domain = email.partition("@") + local = local.replace(".", "") + local = local.split("+")[0] + email = local + at + domain + valid_emails.add(email) + return len(valid_emails) +``` From 922fa4ae1669ad706c4082c12e284939f68ad35b Mon Sep 17 00:00:00 2001 From: aiueoriku <112373068+aiueoriku@users.noreply.github.com> Date: Fri, 23 May 2025 13:38:28 +0900 Subject: [PATCH 2/3] add Step4 --- Unique Email Addresses/Unique Email Addresses.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Unique Email Addresses/Unique Email Addresses.md b/Unique Email Addresses/Unique Email Addresses.md index 740c915..6758dc7 100644 --- a/Unique Email Addresses/Unique Email Addresses.md +++ b/Unique Email Addresses/Unique Email Addresses.md @@ -39,3 +39,17 @@ class Solution: valid_emails.add(email) return len(valid_emails) ``` +# Step4 +いただいたアドバイスを元に修正 +```python +class Solution: + def numUniqueEmails(self, emails: List[str]) -> int: + valid_emails = set() + for email in emails: + local, at, domain = email.partition("@") + local = local.split("+")[0] + local = local.replace(".", "") + email = f"{local}@{domain}" + valid_emails.add(email) + return len(valid_emails) +``` From fe355a5c0e0cc97bbc6bee17f1549986571e4a7c Mon Sep 17 00:00:00 2001 From: aiueoriku <112373068+aiueoriku@users.noreply.github.com> Date: Sat, 24 May 2025 09:07:04 +0900 Subject: [PATCH 3/3] Update Unique Email Addresses.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 正規表現 --- .../Unique Email Addresses.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Unique Email Addresses/Unique Email Addresses.md b/Unique Email Addresses/Unique Email Addresses.md index 6758dc7..a3a0073 100644 --- a/Unique Email Addresses/Unique Email Addresses.md +++ b/Unique Email Addresses/Unique Email Addresses.md @@ -53,3 +53,22 @@ class Solution: valid_emails.add(email) return len(valid_emails) ``` + +正規表現を使って解き直してみる +```python +class Solution: + def numUniqueEmails(self, emails: List[str]) -> int: + valid_emails = set() + for email in emails: + local, domain = email.split('@') + local = re.sub(r'\+.*', '', local) + local = re.sub(r'\.', '', local) + email = f'{local}@{domain}' + valid_emails.add(email) + return len(valid_emails) +``` + +- r'.'はすべての文字列を対象とする +- r'\.'は.自体を対象とする +- [\w\.-]+@[\w\.-]+\.\w+とするとemailアドレスの識別に使えるらしい.本問題では,localに.が2つある場合適用できないため,re.subで対応した +