字母異位詞分組: 中等難度(設計hash鍵值)

題目:

給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
說明:

所有輸入均爲小寫字母。
不考慮答案輸出的順序。

思路:
分析題目含義:字母相同的即爲一個類別,期望分到一個組中並在return vec中組成一個vec

如何實現辨別是否爲同一組:使用sort,如果sort後是一樣的,就是同一組
如何判別這一組是否已經存在了呢?:利用hash_map來記錄每一個元素屬於哪一組,如果是第一次出現的組別,val = 0;下一次出現新的組別val = 1…

代碼:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        int flag = 0;
        unordered_map<string, int> data_table;
        // ret[0].push_back("111");
        for(string str : strs)  // 第一次循環,將每個字符串排序後,統計各個字符串屬於第幾組,以flag記錄
        {
            string temp_str = str;
            sort(str.begin(),str.end());
            if(data_table.count(str) <= 0){
                data_table[str] = flag;                
                flag++;      
            }
            data_table[temp_str] = data_table[str];  
        }
                
        vector<vector<string>> ret;
        // 初始化ret
        for(int i =0; i< flag;i++){
            vector<string> temp;
            ret.push_back(temp);
        }
        
        // 搞定ret
        for(string str : strs)
        {
            ret[data_table[str]].push_back(str);
        }

        return ret;
    }
};

優化思路:
能否將上面的幾次循環合併呢?
注意: vector在沒有初始化的時候,是不能直接訪問索引的;
能否在第一次循環的過程中,直接將新出現的組別初始化,並添加到ret中呢?

優化代碼:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        int flag = 0;
        unordered_map<string, int> data_table;
        vector<vector<string>> ret;
        // ret[0].push_back("111");
        for(string str : strs)  // 第一次循環,將每個字符串排序後,統計各個字符串屬於第幾組,以flag記錄
        {
            string Original_str = str;
            sort(str.begin(),str.end());
            
            if(data_table.count(str) <= 0){     // 如果是新出現的組別
                vector<string> temp_vec(1,Original_str);
                ret.push_back(temp_vec);
                data_table[str] = flag;                
                flag++;      
            }
            else {                              // 如果是原始的組別
                ret[data_table[str]].push_back(Original_str);
            }
             
        }
                

        // // 初始化ret
        // for(int i =0; i< flag;i++){
        //     vector<string> temp;
        //     ret.push_back(temp);
        // }
        
        // 搞定ret
        // for(string str : strs)
        // {
        //     ret[data_table[str]].push_back(str);
        // }

        return ret;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章