Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map<string, vector<string> > groups;
vector<string> result;
//sort each string and map anagrams to the same key
//iterator moves forward by one element each time in the strs space
for (vector<string>::iterator iter = strs.begin(); iter != strs.end(); iter++){
string s = *iter;//s points to the element the iterator currently points to
sort(s.begin(), s.end());//sort each string for mapping
groups[s].push_back(*iter);//map the string to its key
}
//in the map class read those keys which contains more than 1 elements
//iter->first is key. iter->second is the strings that mapped to this key.
for (map<string, vector<string> >::iterator iter = groups.begin(); iter != groups.end(); iter++){
if (iter->second.size() > 1)
result.insert(result.end(), iter->second.begin(), iter->second.end());
//insert all strings mapped to this key into result
}
return result;
}
};
http://www.cppblog.com/totti1006/archive/2009/09/01/94955.html
http://www.kuqin.com/cpluspluslib/20071231/3265.html