929. 独特的电子邮件地址
题目描述
每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔。例如,在 alice@leetcode.com中,alice 是本地名称,而 leetcode.com 是域名。除了小写字母,这些电子邮件还可能包含 '.' 或 '+'。
①如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则发往那里的邮件将会转发到本地名称中没有点的同一地址。例如,"alice.z@leetcode.com” 和 “alicez@leetcode.com” 会转发到同一电子邮件地址。(请注意,此规则不适用于域名。) ②如果在本地名称中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如m.y+name@email.com 将转发到 my@email.com。(同样,此规则不适用于域名。)
可以同时使用这两个规则。给定电子邮件列表 emails,我们会向列表中的每个地址发送一封电子邮件。实际收到邮件的不同地址有多少?
说明:1 <= emails[i].length <= 100;1 <= emails.length <= 100;每封 emails[i] 都包含有且仅有一个 '@' 字符。
示例:
输入:["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"。
分析:使用HashSet来存放结果集,HashSet不允许集合中出现重复元素,通过split()方法根据@字符将emails字符串分割成字符串数组,replaceAll("\\.", "")方法将 . 字符替换为空字符,找到 + 字符的下标,返回子字符串substring(0, index),最后拼接字符串,返回set.size()即实际有效邮件地址数目。
class Solution {
public int numUniqueEmails(String[] emails) {
Set<String> set = new HashSet<String>();
for (int i = 0; i < emails.length; i++) {
String[] strs = emails[i].split("@");
String left = strs[0].replaceAll("\\.", "");
int index = left.indexOf("+");
if (index > 0)
left = left.substring(0, index);
set.add(left + "@" + strs[1]);
}
return set.size();
}
}