方法一
实现思想
由于每一个字符在字符串的排列组合是很多的,为了便于比较直接将每一个字符串内部进行排序,排完序之后再将整个字符串数组进行排序,在排序的时候需要记录自己原本的数组下标,然后依次遍历字符串数组,当排序后的字符串相同,就将原本字符串的形式压入相同的字符串数组中即可。
实现代码
bool cmp(const pair<string,int> &a,const pair<string,int> &b){
return a.first<b.first;
}
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<pair<string,int>> data(strs.size());
for(int i=0;i<data.size();i++){
string s(strs[i].begin(),strs[i].end());
sort(s.begin(),s.end());
data[i]=make_pair(s,i);
}
sort(data.begin(),data.end());
vector<vector<string>> re;
if(!strs.size()) return re;
int index=0;
vector<string> tt;
tt.push_back(strs[data[0].second]);
re.push_back(tt);
for(int i=1;i<data.size();i++){
if(data[i].first==data[i-1].first){
re[index].push_back(strs[data[i].second]);
}
else{
index++;
vector<string> t;
t.push_back(strs[data[i].second]);
re.push_back(t);
}
}
return re;
}
};
提交结果及分析
需要对每一个字符串进行排序,然后对字符串数组进行排序
方法二(哈希)
实现思路
尝试设计映射,将所有的映射到一起
(一)
(二)
概括来说就是两种映射方法:一种以排完序之后的字符串,一种以出现过字符的数量(字符数统计向量)
总结
方法一:由于对所有字符串又进行了排序,需要确定原来的位置及原来的字符串所以额外使用了一个pair数据结构来维护。
方法二:想要用拍完序的字符串作为一个映射下标的标志,所以使用了map的数据结构来实现该功能。