929. Unique Email Addresses*
/problems/unique-email-addresses/
题目描述
Every email consists of a local name and a domain name, separated by the@
sign.
For example, inalice@
,alice
is the local name, andis the domain name.
Besides lowercase letters, these emails may contain'.'
s or'+'
s.
If you add periods ('.'
) between some characters in thelocal namepart of an email address, mail sent there will be forwarded to the same address without dots in the local name. For example,"alice.z@"
and"alicez@"
forward to the same email address. (Note that this rule does not apply for domain names.)
If you add a plus ('+'
) in thelocal name, everything after the first plus sign will beignored. This allows certain emails to be filtered, for examplem.y+name@
will be forwarded tomy@
. (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 ofemails
, we send one email to each address in the list. How many different addresses actually receive mails?
Example 1:
Input: ["test.email+alex@","test.e.mail+bob.cathy@","testemail+david@"]Output: 2Explanation: "testemail@" and "testemail@" actually receive mails
Note:
1 <= emails[i].length <= 100
1 <= emails.length <= 100
Eachemails[i]
contains exactly one'@'
character.All local and domain names are non-empty.Local names do not start with a'+'
character.
C++ 实现 1
哈希表. 这道题需要注意额外的操作(比如遇到.
或者+
)都是在local name中进行的, 因此代码中使用is_local_name
判断当前是否在local name中.
class Solution {public:int numUniqueEmails(vector<string>& emails) {unordered_set<string> record;for (auto &email : emails) {string valid_email;int i = 0;bool is_local_name = true;while (i < email.size()) {if (email[i] == '@') is_local_name = false;if (email[i] == '.' && is_local_name) {++ i;} else if (email[i] == '+' && is_local_name) {while (i < email.size() && email[i] != '@') ++ i;} else {valid_email += email[i++];}}record.insert(valid_email);}return record.size();}};