自我修炼_中级算法篇_leetcode_第3题

字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 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里。这样实现是十分复杂的。写了一般就放弃了。然后看了官网的代码,发现排序是十分简单的。

1.排序

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跑一边的结果如下图

自我修炼_中级算法篇_leetcode_第3题_第1张图片

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以上时,用这个就对了,因为他快!

2.计数

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Leetcode,算法,leetcode,职场和发展)