LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路:根据题目可以知道将“字母组成相同,顺序不同的字符串”分为一组,所以一组的字符串排序后的字符顺序必然相同(eg:"aacbd"和“badca”将字符串中字母元素排序后均为“aabcd”),所以使用哈希表,将排序后字符串(“aabcd”)作为键,对应的同为一组的所有字符串({"aacbd",“badca”})作为值.最终有几个键就有几个分组。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string,vector<string>>table;
//对各个字符串分别进行排序,并放入哈希表中
for(int i=0;i<strs.size();i++){
string uni=strs[i];
//sort(uni);错误
sort(uni.begin(),uni.end());
//注意判断哈希表中字符串列如何添加元素,使用push_back()而不是push()
table[uni].push_back(strs[i]);
}
//根据哈希表中键的个数进行分组,并放入
vector<vector<string>>result;
//注意记忆如何遍历哈希表
for(auto it=table.begin();it!=table.end();it++){
//遍历到第一个键值对 (key1, {value1,2,3}),执行 result.push_back({value1,2,3}),将 {value1,2,3} 添加到result向量的末尾,即 result中的第一个元素是 {value1,2,3},表示第一个分组的字符串集合。
result.push_back(it->second);
}
return result;
}
};
代码分析:
(1)
vector<vector<string>> groupAnagrams(vector<string>& strs) {
}
其中vector<vector<string>>为函数返回类型,其中vector<string>表示一个字符串向量{string1,string2....},而vector<vector<string>>表示由字符串向量组成的向量,本质是一个二维向量:
{
{string1,string2....},
{string1,string2....},
{string1,string2....},
{string1,string2....},
}
(2)
result.push_back(it->second);
it是一个迭代器,指向map中一个键值对,其中first
表示键(key),second
表示值(value)。因此,it->second
表示迭代器 it
所指向的元素的值部分
(3)
table[uni].push_back(strs[i]);
将原始字符串 strs[i]
添加到 table[uni]
所对应的字符串向量的末尾