字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 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] 仅包含小写字母
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvaszc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意是,当出现了一样的字母的单词,放到一个数组里。
开始我想的是使用ASK码来做这道题,在vs上写了一会,发现这样实现是十分困难的,首先要将容器的每一个放进string串,再将每一个string串放进char类型,在转成ASK码,相加,添加一个哈希表,将string串放入,ASK码放入value值中,如果相同,再把他们放入ans里。这样实现是十分复杂的。写了一般就放弃了。然后看了官网的代码,发现排序是十分简单的。
unordered_map> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);
}
首先是,在循环里,重新声明了一个字符串key,将key排序,然后将符合map[key]的str值放入mp[key]中。在vs跑一边的结果如下图
for (auto it = mp.begin(); it != mp.end(); ++it) {
cout<first<second.size()<second.begin();r !=it->second.end();++r){
cout<<*r<
这是输出他的代码。我们要理解的是,map的first存放的是排序之后的键值,而value值是一个vector容器,里面放着我们应该打出来的数据。也就是map的second是个容器。
最后只用把他放入一个容器就好了。
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);
}
return ans;
这里有个疑问,为什么不用push_back()而用emplace_back(),这是c++11新增的插入函数,当你使用c++11以上时,用这个就对了,因为他快!
class Solution {
public:
vector> groupAnagrams(vector& strs) {
// 自定义对 array 类型的哈希函数
auto arrayHash = [fn = hash{}] (const array& arr) -> size_t {
return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) {
return (acc << 1) ^ fn(num);
});
};
unordered_map, vector, decltype(arrayHash)> mp(0, arrayHash);
for (string& str: strs) {
array counts{};
int length = str.length();
for (int i = 0; i < length; ++i) {
counts[str[i] - 'a'] ++;
}
mp[counts].emplace_back(str);
}
vector> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/group-anagrams/solution/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。