一、题目
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 无序map
(1)思路
根据题目要求,想到可以为每组 字母异位词 设计一个唯一的标记,然后直接遍历分组。
一种准确且易实现的标记方法:将每组 字母异位词,用字典序最小的序列进行标记。
经测试,在本题样例集下,用 unordered_map 效率高于 map。
在此基础上,思考缩圈后内圈数字的旋转过程,得到规律。
(2)代码
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
unordered_map<string, vector<string>> m;//经测试,用unordered_map在本题中效率高于map
for (string s : strs) {
string st = s;
sort(st.begin(), st.end());
m[st].push_back(s);
}
auto it = m.begin();
while (it != m.end()) {//经测试,用指针直接操作比遍历push更快;
ans.push_back(it->second);
it++;
}
return ans;
}
};
(3)结果
执行用时 :44 ms, 在所有 C++ 提交中击败了 97.63% 的用户;
内存消耗 :18.8 MB, 在所有 C++ 提交中击败了 77.70% 的用户。
三、其他
- auto:C++11 的新特性,可以在声明变量的时候,根据变量初始值的类型,自动为此变量选择匹配的类型(发生在编译阶段,不影响程序执行效率)。