题目:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
思路:利用一个map记录。因为当一个字符串第一次出现时,并不知道是否可以和后面的字符串构成anagram,因此先将它放入map。当后面发现有可以构成anagram的字符串时,检查第一个字符串是否放入,若没有,放入即可。判断是否构成anagram的方法是利用sort,然后判断是否相等。
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
unordered_map<string, int> record;
vector<string> result;
for (int i = 0; i < (int)strs.size(); ++i) {
string temp = strs[i];
sort(temp.begin(), temp.end());
unordered_map<string, int>::iterator it = record.find(temp);
if (it == record.end()) {
record.insert(make_pair(temp, i));
} else {
if (it->second != -1) {
result.push_back(strs[it->second]);
it->second = -1;
}
result.push_back(strs[i]);
}
}
return result;
}
};
总结:复杂度O(n).