929. 独特的电子邮件地址
929. 独特的电子邮件地址
题目
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.
题目大意
每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 '@'
符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.'
或 '+'
。
- 例如,在
alice@leetcode.com
中,alice
是 本地名 ,而leetcode.com
是 域名 。
如果在电子邮件地址的本地名 部分中的某些字符之间添加句点('.'
),则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意,此规则 不适用于域名 。
- 例如,
"alice.z@leetcode.com”
和“alicez@leetcode.com”
会转发到同一电子邮件地址。
如果在本地名 中添加加号('+'
),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件。同样,此规则 不适用于域名 。
- 例如
m.y+name@email.com
将转发到my@email.com
。
可以同时使用这两个规则。
给你一个字符串数组 emails
,我们会向每个 emails[i]
发送一封电子邮件。返回实际收到邮件的不同地址数目。
示例 1:
输入: emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
输出: 2
解释: 实际收到邮件的是 "testemail@leetcode.com" 和 "testemail@lee.tcode.com"。
示例 2:
输入: emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]
输出: 3
提示:
1 <= emails.length <= 100
1 <= emails[i].length <= 100
emails[i]
由小写英文字母、'+'
、'.'
和'@'
组成- 每个
emails[i]
都包含有且仅有一个'@'
字符 - 所有本地名和域名都不为空
- 本地名不会以
'+'
字符作为开头 - 域名以
".com"
后缀结尾。 - 域名在
".com"
后缀前至少包含一个字符
解题思路
定义辅助函数
clean
用变量
ignore
代表遇到了+
,要忽略后续字符,初始化为false
;用变量
domain
代表遇到了@
,后续的字符都属于域名部分,初始化为false
;遍历传入单个邮箱地址:
- 遇到
.
且不是域名部分(domain == false
)时,跳过; - 当遇到
+
且不是域名部分(domain == false
)时,将标记ignore
置为true
,代表忽略后续字符; - 遇到
@
时,将标记ignore
置为false
,代表忽略字符不生效了,标记domain
置为true
,代表后续的字符都属于域名部分; - 对于每个字符,只要忽略字符不生效(
ignore == false
),就将字符加入到结果字符串中;
- 遇到
遍历结束后,返回结果字符串。
使用
Set
去重- 逐个处理邮箱地址,将处理后的结果存入
Set
数据结构中(Set
会自动去重)。
- 逐个处理邮箱地址,将处理后的结果存入
返回结果
- 返回
Set
中元素的数量,即唯一邮箱地址的数量。
- 返回
复杂度分析
- 时间复杂度:
O(n * m)
,n
是邮箱地址的数量,m
是每个邮箱地址的平均长度,需要遍历每个邮箱的所有字符以进行处理。 - 空间复杂度:
O(n * m)
,使用了Set
来存储唯一邮箱地址。
代码
/**
* @param {string[]} emails
* @return {number}
*/
var numUniqueEmails = function (emails) {
const clean = (str) => {
let res = '';
let ignore = false,
domain = false;
for (let char of str) {
if (char === '.' && !domain) {
continue;
} else if (char === '+' && !domain) {
ignore = true;
} else if (char === '@') {
ignore = false;
domain = true;
}
if (!ignore) {
res += char;
}
}
return res;
};
let set = new Set();
for (let email of emails) {
set.add(clean(email));
}
return set.size;
};