思路:这个题目,肯定不能拿一个字符串求全排列,接着查找存在全排列的里面的字符串,这种方法是可以解出来,但是需要对不相同的字符串进行求全排列,那这里可以做两道题了。首先要查找这里面的规律,由于字母是一样的,所以就从分析每个字符串的字符的所属就好了,故可以用hash的方法,也就是记录字符与对应的字符串;另外一种解法就是对所有字符串进行顺序排列,如果相同的就是属于题目的要求的字符串
1.顺序排序:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<string> tmp = strs;
vector<vector<string>> finalResult;
for(int i=0;i<tmp.size();i++){
sort(tmp[i].begin(),tmp[i].end()); //sort修改的结果是会修改掉原来的值
}
vector<int> flag= vector(strs.size(),0); //初始化vector
for(int i=0;i<tmp.size();i++){
if(flag[i]==1){
continue;
}
vector<string> firRes;
flag[i] = 1;
firRes.push_back(strs[i]);
for(int j=i+1;j<tmp.size();j++){
if(tmp[i]==tmp[j]){
firRes.push_back(strs[j]);
flag[j] = 1;
}
}
finalResult.push_back(firRes);
}
return finalResult;
}
};
2.根据字符的个数相同来找到字母相同的字符串
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> finalRes;
map <map<char,int>,vector<string>> record;
for(int i=0;i<strs.size();i++){
map<char,int> tmp;
for(int j=0;j<strs[i].size();j++){
tmp[strs[i][j]]++; //记录每个字符串的长度
}
record[tmp].push_back(strs[i]);
}
for(map<map<char,int>,vector<string> >::iterator it=record.begin();it!=record.end();it++){ //如何取出map的值
finalRes.push_back(it->second);
}
return finalRes;
}
};
第二个方法:需要学习的知识点就是map的应用,map的操作,关于怎么定义,还有取值