时间复杂度分析:N
是字符串个数,L
是字符串平均长度。对于每个字符串,哈希表和vector
的插入操作复杂度都是 $O(1)$,排序复杂度是 $O(LlogL)$。所以总时间复杂度是 $O(NLlogL)$。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
for (auto& str: strs) {
string n_str = str;
sort(n_str.begin(), n_str.end());
hash[n_str].push_back(str);
}
vector<vector<string>> res;
for (auto& item: hash)
res.push_back(item.second);
return res;
}
};
哈希表的两种遍历方式:
for (auto &item : hash)
{
cout << item.first << ' ' << item.second << endl;
}
或
for (unordered_map<string, double>::iterator it = hash.begin(); it != hash.end(); it ++ )
{
cout << it->first << ' ' << it->second << endl;
}
y总代码:
算法
(哈希表) $O(NLlogL)$
定义从string
映射到 vector<string>
的哈希表:unordered_map<string, vector<string>>
,哈希表用法参见 这里 。
我们将每个字符串的所有字符从小到大排序,将排好序的字符串作为key
,然后将原字符串插入key
对应的vector<string>
中
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> dict;
for (auto &str : strs)
{
string key = str;
sort(key.begin(), key.end());
dict[key].push_back(move(str));
}
vector<vector<string>> res;
for (auto i = dict.begin(); i != dict.end(); i ++ )
{
res.push_back(move(i -> second));
}
return res;
}
};
move()
本来需要将整个字符串copy
过去,使用move
之后只需要把字符串的首地址赋值过去,可以减少一次拷贝操作,提高效率。