题目描述:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
Anagram的意思就是若一个单词里的字母变序以后可以得到另一个字母,则这两个字母为anagram。也就是说组成两个单词的字母相同就可以认为这两个单词是anagram,通过将字符串排序后比较可以很方便进行判定。我解的时候用了一个set储存符合条件的元素来进行去重,如果不想用set的话可以考虑用map记录下当前的anagram,并用一个数组进行标记,出现下一个anagram时将之前的放入ret,然后更新map和vector。
代码如下:
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
unordered_map<string, int> cont;
unordered_set<int> record;
vector<string> ret;
for (int i = 0; i < strs.size(); i++){
string curr = strs[i];
if (curr.length())
sort(&curr[0], &curr[curr.length()]);
if (cont.count(curr)){
record.insert(cont[curr]);
record.insert(i);
}
cont[curr] = i;
}
for (unordered_set<int>::iterator iter = record.begin(); iter != record.end(); iter++)
ret.push_back(strs[*iter]);
return ret;
}
};