1. 程式人生 > >LeetCode0929.獨特的電子郵件地址

LeetCode0929.獨特的電子郵件地址

0929.獨特的電子郵件地址

描述

每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。

例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。

除了小寫字母,這些電子郵件還可能包含 ',''+'

如果在電子郵件地址的本地名稱部分中的某些字元之間新增句點('.'),則發往那裡的郵件將會轉發到本地名稱中沒有點的同一地址。例如,"[email protected][email protected] 會轉發到同一電子郵件地址。 (請注意,此規則不適用於域名。)

如果在本地名稱中新增加號('+'),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如 [email protected] 將轉發到 [email protected]。 (同樣,此規則不適用於域名。)

可以同時使用這兩個規則。

給定電子郵件列表 emails,我們會向列表中的每個地址傳送一封電子郵件。實際收到郵件的不同地址有多少?

例項

輸入:["[email protected]","[email protected]","[email protected]"]
輸出:2
解釋:實際收到郵件的是 "[email protected]
" 和 "[email protected]"。

提示

  • 1 <= emails[i].length <= 100
  • 1 <= emails.length <= 100
  • 每封 emails[i] 都包含有且僅有一個 '@' 字元。

題解

  • 新建HashMap用於儲存每一個域名和域名下的地址
  • 對每一個地址的本地名稱都轉化為標準格式
  • 利用HashSet儲存每一個域名下的地址
class Solution {
    public static int numUniqueEmails(String[] emails)
{ HashMap<String, HashSet<String>> comMap = new HashMap<>(); HashSet<String> addSet; String first; String last; for(String adress:emails){ int index = adress.indexOf('@'); first = adress.substring(0,index); first = getRightAddress(first); last = adress.substring(index+1,adress.length()); if (comMap.containsKey(last)){ addSet = comMap.get(last); addSet.add(first); } else { addSet = new HashSet<>(); addSet.add(first); comMap.put(last,addSet); } } int counter = 0; for(HashSet<String> nowSet:comMap.values()){ counter += nowSet.size(); } return counter; } public static String getRightAddress(String address){ char[] nowAddress = new char[address.length()]; int index = 0; for (int i = 0; i < address.length(); i++) { char nowChar = address.charAt(i); if (nowChar == '.') continue; if (nowChar == '+'){ index++; break; } else { nowAddress[index] = nowChar; index++; } } String result = (new String(nowAddress)).substring(0,index-1); return result; } }