给定一个由N 个字符串组成的数组arr[] ,其中每个字符串代表一个由英文字母‘.’、’+’和‘@’组成的电子邮件地址,任务是根据以下公式计算数组中存在的不同电子邮件的数量以下规则:
- 一个电子邮件地址可以被拆分为两个子串, ‘@’的前缀和后缀,分别是本地名称和域名。
- ‘.’忽略本地名称中字符串中的字符。
- 在本地名称中,忽略“ + ”之后的每个字符。
例子:
Input: arr[] = {“raghav.agg@geeksforgeeks.com”, “raghavagg@geeksforgeeks.com”}
Output: 1
Explanation: Removing all the ‘.’s before ‘@’ modifies the strings to {“raghavagg@geeksforgeeks.com”, “raghavagg@geeksforgeeks.com”}. Therefore, the total number of distinct emails present in the string are 1.
Input: arr[] = {“avruty+dhir+gfg@geeksforgeeks.com”, “avruty+gfg@geeksforgeeks.com”, “av.ruty@geeksforgeeks.com”}
Output: 1
方法:给定的问题可以通过将每个电子邮件按照给定的规则填充后存储在一个HashSet中并打印获得的HashSet的大小来解决。请按照以下步骤解决问题:
- 初始化一个 HashSet,比如S ,根据给定的规则在填充后存储所有不同的字符串。
- 遍历给定的数组arr[]并执行以下步骤:
- 找到‘@’的位置并将其存储在一个变量中,比如pos2 。
- 删除所有的“.” pos2之前的字符使用 erase()函数。
- 更新‘@’的位置,即pos2 = find(‘@’)并找到‘+’的位置并将其存储在一个变量中,比如pos1作为S.find(‘+’) 。
- 现在,擦除pos1之后和pos2之前的所有字符。
- 将所有更新的字符串插入HashSet S 中。
- 完成上述步骤后,打印HashSet S的大小作为结果。
下面是上述方法的实现:
C++14
// C++ program for the above approach
#include
using namespace std;
// Function to count all the distinct
// emails after preprocessing according
// to the given rules
int distinctEmails(vector& emails)
{
// Traverse the given array of
// strings arr[]
for (auto& x : emails) {
// Stores the position of '@'
// in the string
auto pos2 = x.find('@');
// If pos2 < x.size()
if (pos2 < x.size())
// Erases all the ocurrences
// of '.' before pos2
x.erase(
remove(x.begin(),
x.begin() + pos2, '.'),
x.begin() + pos2);
// Stores the position of the
// first '+'
auto pos1 = x.find('+');
// Update the position pos2
pos2 = x.find('@');
// If '+' exists then erase
// characters after '+' and
// before '@'
if (pos1 < x.size()
and pos2 < x.size()) {
x.erase(pos1, pos2 - pos1);
}
}
// Insert all the updated strings
// inside the set
unordered_set ans(
emails.begin(),
emails.end());
// Return the size of set ans
return ans.size();
}
// Driver Code
int main()
{
vector arr
= { "raghav.agg@geeksforgeeks.com",
"raghavagg@geeksforgeeks.com" };
// Function Call
cout << distinctEmails(arr);
return 0;
}
Python3
# Python3 program for the above approach
# Function to count all the distinct
# emails after preprocessing according
# to the given rules
def distinctEmails(emails):
ans = set([])
# Traverse the given array of
# strings arr[]
for x in emails:
# Stores the position of '@'
# in the string
pos2 = x.find('@')
# If pos2 < x.size()
if (pos2 < len(x)):
# Erases all the ocurrences
# of '.' before pos2
p = x[:pos2]
p = p.replace(".", "")
x = p + x[pos2:]
# Stores the position of the
# first '+'
pos1 = x.find('+')
# Update the position pos2
pos2 = x.find('@')
# If '+' exists then erase
# characters after '+' and
# before '@'
if (pos1 > 0 and pos1 < len(x) and
pos2 < len(x)):
x = x[:pos1] + x[pos2:]
# Insert all the updated strings
# inside the set
ans.add(x)
# Return the size of set ans
return len(ans)
# Driver Code
if __name__ == "__main__":
arr = ["raghav.agg@geeksforgeeks.com",
"raghavagg@geeksforgeeks.com"]
# Function Call
print(distinctEmails(arr))
# This code is contributed by ukasp
1
时间复杂度: O(N 2 )
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。