引用
大家都知道很多算法题并不是思维逻辑的复杂性,而是数据结构的复杂性。好的、合适的数据结构对解某些题来说具有很好的启发作用,他能很快让你想到题目的最终的解决思路。
对于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;
}