Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
For example:
Input: ["tea","and","ate","eat","den"]
Output: ["tea","ate","eat"]
Interface: vector<string>anagrams(vector<string>&strs);
#include <iostream> #include <vector> #include <unordered_map> #include <string> #include <algorithm> using namespace std; //方法一 //用unordered_map<string,vector<string>> anagram 记录排序后的字符串与未排序的字符串 //如果对应的未排序字符串数量超过一个,记录到新的vector中 vector<string> anagrams(vector<string> &strs) { vector<string> res; string s; if(strs.size() <= 1) return res; unordered_map<string,vector<string>> anagram; for(int i=0;i<strs.size();i++) { s = strs[i]; sort(s.begin(),s.end()); anagram[s].push_back(strs[i]); } for(auto it=anagram.begin();it!=anagram.end();it++) { if(it->second.size()>1) { res.insert(res.end(),it->second.begin(),it->second.end()); } } return res; } //方法二 //思路:用map<string, int>记录排序后的字符串以及首次出现的位置。 //1. 从strs的第一个元素开始遍历,首先对元素进行排序得到s; //2. 在map里查找s; //3. 若不存在,将s以及该元素的下标存入map<string ,int>; //4. 若存在,首先将第一次出现s时的原始字符串存入结果res,即strs[map[s]],并将map[s]设置为-1(防止下次再存),再将该字符串本身存入结果res; //5. 重复以上1-4步,直到遍历结束。 vector<string> anagrams(vector<string> &strs) { vector<string> res; string s; if(strs.size() <= 1) return res; unordered_map<string,int> anagram; for(int i=0;i<strs.size();i++) { s = strs[i]; sort(s.begin(),s.end()); if (anagram.find(s) == anagram.end()) anagram.insert(pair<string,int>(s,i)); else { if(anagram[s]>=0) { res.push_back(strs[anagram[s]]); anagram[s] = -1; } res.push_back(strs[i]); } } return res; } void showVector(vector<string> &strs) { for(auto it=strs.begin();it!=strs.end();it++) { printf("%s ",(*it).c_str()); } //for(int i =0;i<strs.size();i++) //{ //printf("%s ",strs[i].c_str()); //} printf("\n"); } void main() { vector <string> res; string array[] = {"abc","bac","cab","123","efg"}; int len = sizeof(array)/sizeof(string); vector <string> strs(array,array+len); showVector(strs); res = anagrams(strs); showVector(res); }