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;
    }

 

 

 

 

 

发布了28 篇原创文章 · 获赞 15 · 访问量 8270

猜你喜欢

转载自blog.csdn.net/weixin_38976558/article/details/95763393
今日推荐