Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
题意:
给出一个字符串的vector,找出其中能够通过变化字符顺序得到相同字符串的那些字符串的group,最后返回这些group。
思路:
通过字符变化就可以得到相同的字符串,说明这些字符串是一个字符串的全排列的不同形式,所以这些一个group里面的字符串通过sort后一定是可以得到相同的字符串的,依据这个就可以将原来的字符串分组。但是最后的结果要求输出的是原先的字符串,那么要是字符串sort的话就会改变。解决这个问题,可以通过构造一个结构体,里面包含原先的字符串str和sort后的字符串sstr,然后结构体数组按照sstr排序就能得到分组,然后按照分组情况返回原字符串的group就可。
代码:
<span style="font-family:Microsoft YaHei;font-size:14px;">class Solution {
public:
struct Aux{
string str;
string sstr;
bool operator < (Aux& a){
return sstr<a.sstr;
}
};
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<string> vs;
vector<vector<string>> res;
int len=strs.size();
if(len==1 && strs[0]==""){
vs.push_back("");
res.push_back(vs);
return res;
}
vector<Aux> aux;
Aux a;
for(int i=0;i<len;i++){
a.str=strs[i];
a.sstr=strs[i];
sort(a.sstr.begin(), a.sstr.end());
aux.push_back(a);
}
sort(aux.begin(), aux.end());
for(int i=0;i<len;i++){
if(i==0 || aux[i].sstr==aux[i-1].sstr) vs.push_back(aux[i].str);
else{
res.push_back(vs);
vs.clear();
vs.push_back(aux[i].str);
}
}
res.push_back(vs);
return res;
}
};</span>
复杂度:
遍历的时间复杂度是O(n),但是给每一个string排序的时间记为O(mlogm),所以为O(mnlogm)。