49.字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
//字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。
思路:将集合中的所有字符串进行排序处理,再将排序后的相同的字符串放入同一个vector中,所以可以使用unordered_map,其中键为排序后的字符串,值为排序后相同的字符串的集合(就是将排序后相同的字符串的原始字符串放入同一个vector中)
我们需要遍历一次字符串,但这样太慢了,所以我们可以直接引用字符串,因为不对集合进行修改,所以我们需要复制原字符串,再将复制的字符串进行排序,以此作为该字符串的分组标识,排序使用std::sort
为避免内存消耗过多,我们需要预分配内存来避免push_back的多次扩容
避免重复拷贝,我们可以使用std::move来将其存储
最后我们需要一个vector<vector
代码:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> map;
for(auto& c:strs){
auto t = c;
sort(t.begin(),t.end());
map[t].push_back(c);
}
vector<vector<string>> ans;
ans.reserve(map.size());
for(auto& [key,value]:map){
ans.push_back(move(value));
}
return ans;
}
};
时间复杂度:O(NLlog L)
空间复杂度:O(N*L)
浙公网安备 33010602011771号