1. 程式人生 > >Leetcode 929 獨特的電子郵件(Python和C++實現)

Leetcode 929 獨特的電子郵件(Python和C++實現)

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

例如,在 [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] 都包含有且僅有一個 '@' 字元。

Python實現比較簡單:

class Solution:
    def numUniqueEmails(self, emails):
        """
        :type emails: List[str]
        :rtype: int
        """
        res=set()
        for email in emails:
            local=email.split('@')[0]
            dns=email.split('@')[1]
            true_local=local.split('+')
            res.add(true_local[0].replace('.','')+dns)
        return len(res)

C++想了很久最終放棄,看到網上大神的解決方案:

class Solution {
public:
    int numUniqueEmails(vector<string>& emails) {
        unordered_set<string> result;
        for(auto& email : emails){
            auto at_pos = email.find('@');
            auto plus_pos = email.find('+');
            if(at_pos>plus_pos){
                int lens = at_pos - plus_pos;
                email.erase(plus_pos,lens);
                at_pos-=lens;
            }
            auto dot_pos = email.find('.');
            while(dot_pos<at_pos){
                email.erase(dot_pos,1);
                at_pos--;
                dot_pos=email.find('.');
            }
            result.insert(email);
        }
        return result.size();
        
    }
};