09 Sept 2026Go / Python / TypeScriptEasy

Unique Email Addresses

Count distinct destination addresses after applying local-name normalization rules.

Split each address, remove the local part after plus, delete local dots, then combine it with the unchanged domain in a set.

complexity

O(total characters) time and space.

solution files

  • Go unique-email-addresses/solution.go
  • Python unique-email-addresses/solution.py
  • TypeScript unique-email-addresses/solution.ts

Solution files

Gounique-email-addresses/solution.go
package main

import "strings"

func numUniqueEmails(emails []string) int {
	unique := map[string]bool{}
	for _, email := range emails {
		parts := strings.SplitN(email, "@", 2)
		local := strings.SplitN(parts[0], "+", 2)[0]
		local = strings.ReplaceAll(local, ".", "")
		unique[local+"@"+parts[1]] = true
	}
	return len(unique)
}
Pythonunique-email-addresses/solution.py
class Solution:
    def numUniqueEmails(self, emails: list[str]) -> int:
        unique: set[str] = set()
        for email in emails:
            local, domain = email.split(class="syntax-string">"@")
            unique.add(local.split(class="syntax-string">"+")[class="syntax-number">0].replace(class="syntax-string">".", class="syntax-string">"") + class="syntax-string">"@" + domain)
        return len(unique)
TypeScriptunique-email-addresses/solution.ts
function numUniqueEmails(emails: string[]): number {
  const unique = new Set<string>();
  for (const email of emails) { const [local, domain] = email.split(class="syntax-string">"@"); const normalized = local.split(class="syntax-string">"+")[class="syntax-number">0].replaceAll(class="syntax-string">".", class="syntax-string">""); unique.add(normalized + class="syntax-string">"@" + domain); }
  return unique.size;
}