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