Unique Email Addresses
LeetCode 965 | Difficulty: Easyβ
EasyProblem Descriptionβ
Every valid email consists of a local name and a domain name, separated by the '@' sign. Besides lowercase letters, the email may contain one or more '.' or '+'.
- For example, in `"alice@leetcode.com"`, `"alice"` is the **local name**, and `"leetcode.com"` is the **domain name**.
If you add periods '.' between some characters in the local name part of an email address, mail sent there will be forwarded to the same address without dots in the local name. Note that this rule does not apply to domain names.
- For example, `"alice.z@leetcode.com"` and `"alicez@leetcode.com"` forward to the same email address.
If you add a plus '+' in the local name, everything after the first plus sign will be ignored. This allows certain emails to be filtered. Note that this rule does not apply to domain names.
- For example, `"m.y+name@email.com"` will be forwarded to `"my@email.com"`.
It is possible to use both of these rules at the same time.
Given an array of strings emails where we send one email to each emails[i], return the number of different addresses that actually receive mails.
Example 1:
Input: emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
Output: 2
Explanation: "testemail@leetcode.com" and "testemail@lee.tcode.com" actually receive mails.
Example 2:
Input: emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]
Output: 3
Constraints:
- `1 <= emails.length <= 100`
- `1 <= emails[i].length <= 100`
- `emails[i]` consist of lowercase English letters, `'+'`, `'.'` and `'@'`.
- Each `emails[i]` contains exactly one `'@'` character.
- All local and domain names are non-empty.
- Local names do not start with a `'+'` character.
- Domain names end with the `".com"` suffix.
- Domain names must contain at least one character before `".com"` suffix.
Topics: Array, Hash Table, String
Approachβ
Hash Mapβ
Use a hash map for O(1) average lookups. Store seen values, frequencies, or indices. The key question: what should I store as key, and what as value?
Need fast lookups, counting frequencies, finding complements/pairs.
String Processingβ
Consider character frequency counts, two-pointer approaches, or building strings efficiently. For pattern matching, think about KMP or rolling hash. For palindromes, expand from center or use DP.
Anagram detection, palindrome checking, string transformation, pattern matching.
Solutionsβ
Solution 1: C# (Best: 104 ms)β
| Metric | Value |
|---|---|
| Runtime | 104 ms |
| Memory | 28.3 MB |
| Date | 2020-02-21 |
public class Solution {
public int NumUniqueEmails(string[] emails) {
HashSet<string> uEmails = new HashSet<string>();
foreach (var email in emails)
{
var emailArr = email.Split('@');
string emailId = emailArr[0];
if(emailId.IndexOf('+')!=-1)
{
emailId = emailId.Substring(0, emailId.IndexOf('+'));
}
uEmails.Add($"{emailId.Replace(".", "")}@{emailArr[1]}");
}
return uEmails.Count();
}
}
π 1 more C# submission(s)
Submission (2019-02-24) β 116 ms, 26.4 MBβ
public class Solution {
public int NumUniqueEmails(string[] emails) {
HashSet<string> uEmails = new HashSet<string>();
foreach (var email in emails)
{
var emailArr = email.Split('@');
string emailId = emailArr[0];
if(emailId.IndexOf('+')!=-1)
{
emailId = emailId.Substring(0, emailId.IndexOf('+'));
}
uEmails.Add($"{emailId.Replace(".", "")}@{emailArr[1]}");
}
return uEmails.Count();
}
}
Complexity Analysisβ
| Approach | Time | Space |
|---|---|---|
| Hash Map | $O(n)$ | $O(n)$ |
Interview Tipsβ
- Start by clarifying edge cases: empty input, single element, all duplicates.
- Hash map gives O(1) lookup β think about what to use as key vs value.