题目地址:
https://www.lintcode.com/problem/count-email-groups/description
给定一个长
n
n
n字符串数组
A
A
A,代表email地址。规定,在@
之前忽略所有.
,在@
之前忽略所有+
及其后面的字符。问一共有多少个不同的邮箱地址组。每一组必须至少两个邮箱地址。
可以先找到@
的下标,然后把email还原出来。同时用哈希表记录每个email出现次数。代码如下:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Solution {
/**
* @param emails: Original email
* @return: Return the count of groups which has more than one email address in it.
*/
public int countGroups(List<String> emails) {
// Write your code here
Map<String, Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
for (String email : emails) {
sb.setLength(0);
int idx = 0;
for (int i = 0; i < email.length(); i++) {
char ch = email.charAt(i);
if (ch == '@') {
idx = i;
break;
}
}
for (int i = 0; i < email.length(); i++) {
char ch = email.charAt(i);
if (i < idx && ch == '+') {
i = idx - 1;
continue;
}
if (i < idx) {
sb.append(ch == '.' ? "" : ch);
} else {
sb.append(ch);
}
}
String s = sb.toString();
map.put(s, map.getOrDefault(s, 0) + 1);
}
int res = 0;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// 只有至少出现两次的才能计数
if (entry.getValue() > 1) {
res++;
}
}
return res;
}
}
时空复杂度 O ( n l ) O(nl) O(nl), l l l是最长字符串长度。