Every email consists of a local name and a domain name, separated by the @ sign.
For example, in [email protected]
, alice is
the local name, and leetcode.com
is the domain name.
Besides lowercase letters, these emails may contain '.'
s or '+'
s.
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. For example, "[email protected]"
and "[email protected]"
forward to the same email address. (Note that this rule does not apply for domain names.)
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, for example [email protected]
will be forwarded to [email protected]
. (Again, this rule does not apply for domain names.)
It is possible to use both of these rules at the same time.
Given a list of emails
, we send one email to each address in the list. How many different addresses actually receive mails?
Input: ["[email protected]","[email protected]","[email protected]"]
Output: 2
Explanation: "[email protected]" and "[email protected]" actually receive mails
- mine
// O(n)time O(n)space
class Solution {
public int numUniqueEmails(String[] emails) {
Set<String> res = new HashSet<>();
for(String email : emails){
res.add(getShortEmail(email));
}
return res.size();
}
public String getShortEmail(String email){
String temp = email.substring(0, email.indexOf("@"));
String end = email.substring(email.indexOf("@"), email.length());
temp = temp.replaceAll("\\.", "");
int plus = temp.indexOf("+");
if(plus == -1){
return temp + end;
}else{
return temp.substring(0,plus) + end;
}
}
}
- the most votes
public int numUniqueEmails(String[] emails) {
Set<String> normalized = new HashSet<>(); // used to save simplified email address, cost O(n) sapce.
for (String email : emails) {
String[] parts = email.split("@"); // split into local and domain parts.
String[] local = parts[0].split("\\+"); // split local by '+'.
normalized.add(local[0].replace(".", "") + "@" + parts[1]); // remove all '.', and concatenate '@' and domain.
}
return normalized.size();
}