输入:字符串数组 strs
要求:将其中的字母异位词分组,返回每一组。字母异位词:两个字符串字符相同,但排列顺序不同。
输出:vector<vector<string>>
思路:核心思路自然是为每个字符串构造一个相同的 key,再把 key 相同的字符串放到同一个 vector 里。
而字母异位词的特点正是:字母顺序可以不同,但每个字母的出现次数是固定一致的。
因此,用各字符的计数数组作为 key 非常自然。
另外,map 也正好支持 vector<int> 作为 key,这让整个分组过程变得非常直接。
复杂度:
时间复杂度:O(n * m)
空间复杂度:O(n * m)
n = 字符串数量 m = 字符串最大长度
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
//vector<string> tmp;
vector<vector<string>> ans;
map<vector<int>, vector<string>> tmp;
for (int i = 0; i < strs.size(); i++) {
vector<int> t(26, 0);
for (int j = 0; j < strs[i].size(); j++) {
t[strs[i][j] - 'a']++;
}
if (tmp.find(t) != tmp.end()) {
tmp[t].push_back(strs[i]);
}
else {
tmp[t];
tmp[t].push_back(strs[i]);
}
}
//遍历哈希表 把每个value放进ans里
for (auto const& pair : tmp) {
ans.push_back(pair.second); // pair.second 就是 map 的值,即 vector<string>
}
return ans;
}
};
字母异位词分组算法解析
83

被折叠的 条评论
为什么被折叠?



