本题源自LeetCode点击打开链接
-------------------------------------------------------
思路: 回文即出现的字符串的字符顺序变化构成。
1 用一个map 做映射。map《string,int》
2 将字符串排序,然后放入map,值为 字符串在数组中的下标,保证了顺序
3 如果已经出现过,就将出现过的字符串压入结果。
代码1:
map<string,int> strMap;
vector<string> result;
int len=strs.size();
if(len==0)
return result;
for(int i=0;i<len;i++){
string tmp=strs[i];
sort(tmp.begin(),tmp.end());
if(strMap.count(tmp)==0){
strMap[tmp]=i; //存放的是 字符串在数组中的下标。
}else{
if(strMap[tmp]>=0){ //说明出现过
result.push_back(strs[strMap[tmp]]); //先压入之前出现的,保证顺序
strMap[tmp]=-1;
}
result.push_back(strs[i]);
}
}
return result;
}
代码2:
vector<string> anagrams(vector<string> &strs) {
unordered_map<string,vector<string>> strMap;
vector<string> result;
int len=strs.size();
if(len==0)
return result;
for(string key:strs){
string temp=key; //值为字符一样的原字符串
sort(key.begin(),key.end()); //键为排序后的字符串
strMap[key].push_back(temp);
}
for(auto it=strMap.begin();it!=strMap.end();it++){
if(it->second.size()>1){
result.insert(result.end(),it->second.begin(),it->second.end());
}
}
return result;
}