思路
核心思路:使用排序后的字符串作为键,将原始字符串分组
- 键的选择:对于每个字符串,将其排序后得到标准形式作为键
- 分组存储:使用哈希表,键是排序后的字符串,值是对应的原始字符串列表
- 结果构建:遍历哈希表,将每个分组添加到结果中
实现分析
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 步骤1:创建哈希表,键是排序后的字符串,值是原始字符串列表unordered_map<string, vector<string>> mp;// 步骤2:遍历所有字符串for(auto& str : strs) {string key = str; // 复制原字符串sort(key.begin(), key.end()); // 排序得到标准键mp[key].emplace_back(str); // 将原字符串添加到对应分组}// 步骤3:构建结果vector<vector<string>> ans;for(auto it = mp.begin(); it != mp.end(); it++) {ans.emplace_back(it->second); // 将每个分组添加到结果中}return ans;}
};
1. 哈希表初始化
unordered_map<string, vector<string>> mp;
- 键(key):排序后的标准字符串
- 值(value):具有相同字母组成的原始字符串列表
2. 处理每个字符串
for(auto& str : strs) {string key = str; // 创建副本sort(key.begin(), key.end()); // 排序得到标准键mp[key].emplace_back(str); // 分组存储
}
- 对于
"eat"
:排序后key = "aet"
,存储["eat"]
- 对于
"tea"
:排序后key = "aet"
,存储["eat", "tea"]
- 对于
"tan"
:排序后key = "ant"
,存储["tan"]
3. 构建结果
vector<vector<string>> ans;
for(auto it = mp.begin(); it != mp.end(); it++) {ans.emplace_back(it->second);
}
- 将哈希表中的每个值(字符串列表)添加到结果中