在本篇文章中,我们将探讨一个常见的算法问题——字母异位词分组。这个问题要求我们给定一个字符串数组,将其中的字母异位词组合在一起。字母异位词是指通过重新排列源单词的所有字母得到的新单词。例如,"eat" 和 "tea" 就是一对字母异位词。
解题思路
解决这个问题的关键在于理解如何识别字母异位词。两个单词是字母异位词,当且仅当它们包含相同的字符和相同的字符频率。我们可以通过以下步骤来解决这个问题:
-
创建哈希表:使用一个哈希表(在C++中为
unordered_map
)来存储排序后的字符串作为键,原始字符串作为值的集合。 -
排序字符串:遍历输入数组,对每个字符串进行排序,并将排序后的字符串作为键,原始字符串作为值存储在哈希表中。
-
分组:由于哈希表的键是排序后的字符串,具有相同字符和频率的字符串将具有相同的键,因此它们将被存储在同一个值集合中。
-
构建结果:遍历哈希表,将每个值集合添加到结果列表中。
代码如下:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> m;
for (int i = 0; i < strs.size(); i++) {
string key = strs[i];
sort(key.begin(), key.end());
m[key].push_back(strs[i]);
}
vector<vector<string>> result;
for (auto& pair : m) {
result.push_back(pair.second);
}
return result;
}
};
算法分析
-
时间复杂度:O(N * K * Log(K)),其中 N 是输入数组的长度,K 是数组中最长字符串的长度。这是因为我们需要对每个字符串进行排序,排序的时间复杂度为 O(K * Log(K))。
-
空间复杂度:O(N * K),用于存储排序后的字符串和原始字符串。
通过这种方法,我们可以有效地将字母异位词分组,同时保持代码的简洁性和高效性。
本题的难点在于,需要熟练使用哈希表相关的容器,弄清楚键和键值对之间的关系,最后如何去使用foreach循环,非常考察队stl的使用。有什么疑问可以再评论区去讨论。