C++ STL中set, maltimap等容器的使用小結 - LeetCode 49 題目

引用

大家都知道很多算法題並不是思維邏輯的複雜性,而是數據結構的複雜性。好的、合適的數據結構對解某些題來說具有很好的啓發作用,他能很快讓你想到題目的最終的解決思路。

對於C++程序員來說,數據結構容器類打包比較好的就是STL了,裏面的容器有序列容器(array,vector,deque,list,forward-list);關聯式容器(set,multiset,map,multimap);無序容器(unordered set,unordered multiset,unordered map,unordered multimap)等。

下面結合某個具體題目介紹一下set, maltimap

題目

leetcode-49. 字母異位詞分組

下面結合我這道題思路順便對這兩個容器進行講解。

根據題意,原題目讓我們對現有的字符串數組中的字符串進行分類,其中只要字母相同的就可以分爲一類,這些分好的屬於同一類字符串放在同一個字符串數組中vector<string>,然後將這些字符串數組共同放在一個數組中vector<vector<string>>中作爲最終的返回結果。

解決思路

由於要對字符串進行分類,所以需要有一個分類標準,我的方法是對所有的字符串進行按照字母表從小到大排序,例如ate排序之後是:aet;bat排序之後是abt。這樣一來所有應該分爲一類的字符串在排序之後應該是完全相同的。然後我們只需要建立一個Multimap進行存儲,其中鍵值key是排序後的字符串,value就是原來沒有排序的字符串。所以我們可以先把排序字符串的方法寫出來(這裏面)

string sortString(string input){
        //升序排列字符
        for(int i=0;i<input.size();i++){
            for(int j=i+1;j<input.size();j++){
                if(input[i]-'a'>input[j]-'a'){
                    char temp = input[j];
                    input[j] = input[i];
                    input[i] = temp;
                }
            }
        }
        return input;
    }

然後我們還需要一個SET容器來存儲總共有多少個鍵值。

然後對所有的字符串進行遍歷一遍之後,將排序後的鍵值key放到set當中,將所有的(排序後字符串,原來字符串)存到multimap當中。然後在遍歷set的過程中,查找multimap中有幾個對應的(key-value)鍵值對,然後遍歷放到一個vector<string>中即可。

multimap的插入:

multimap<string,string> mmap;

mmap.insert(make_pair(str1,str2));//multimap應該插入pair<string,string>類型的數據。

multimap的針對於某一個Key的所有value的遍歷:

int num = mmap.count(key);//計算鍵值爲key的key-value對數。

auto iteMmap = mmap.find(key);//迭代器

for(int i=0;i<num;i++,iteMmap++){

cout<<"key="<<key<<" ,value="<<*iteMmap<<endl;

}

在解本題目的時候,應該從set中取鍵值key,然後在mmap中取key所對應的所有value,然後將這些同類的字符串放一起即可。下面是所有的結題思路和方案:

string sortString(string input){
        //升序排列字符
        for(int i=0;i<input.size();i++){
            for(int j=i+1;j<input.size();j++){
                if(input[i]-'a'>input[j]-'a'){
                    char temp = input[j];
                    input[j] = input[i];
                    input[i] = temp;
                }
            }
        }
        return input;
    }
    
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        //build a multimap
        multimap<string,string> mmap;
        set<string> set1;
        vector<vector<string>>ans;
        auto setIte = set1.begin();
        //先把所有的strs中的數據放到對應的set和mmap中。
        for(int i=0;i<strs.size();i++){
            mmap.insert(make_pair(sortString(strs[i]),strs[i]));
            if(set1.find(sortString(strs[i]))==set1.end()){
                set1.insert(sortString(strs[i]));
            }
        }
        //遍歷set中所有key,在mmap進行搜索所有的value放到同一類vector<string>中。
        for(setIte = set1.begin();setIte!=set1.end();setIte++){
            string key = *setIte;
            auto iteMmap = mmap.find(key);
            vector<string> tempVec;
            for(int i=0,len = mmap.count(key);i<len;i++,iteMmap++){
                tempVec.push_back(iteMmap->second);
            }
            ans.push_back(tempVec);
            tempVec.clear();
        }
        return ans;
    }

 

 

 

 

 

 

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