49. 字母异位词分组-LeetCode(C++)

49. 字母异位词分组

题目

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母
示例

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]
题解

来自力扣机械水母排序+哈希表解法

以题目中所给出的 [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]] 结果样例,不难发现,当我们对其中的每一个字符串,都按照字典序进行排序后,原式就会变为 [[“abt”],[“ant”,“ant”],[“aet”,“aet”,“aet”]] ,由此我们可以归纳出「若两个单词互相为字母异位词,那么他们按照字典序进行排序后,所得结果一定相同」。

因为对于一组字母异位词,每一个按字典序排序后都能得到相同的结果。因此,就可以以这个排序后的结果为 Key ,原字母异位词的一组为 Value,就比如 aet→[ate,eat,tea] 。

具体来说,我们可以建立一个「由一个字符串映射到一个字符串数组」的哈希表Map<String,List> 。我们从左至右遍历 strs ,对于当前的 strs[i] ,我们将其进行排序得到 SortedStr ,随后将 strs[i] 添加到 hash[SortedStr] 所映射到的 List 上即可。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>> hashmap;
        for(auto & str : strs){
            string sortedStr = str;
            sort(sortedStr.begin(), sortedStr.end());
            hashmap[sortedStr].emplace_back(str);
        }
        vector<vector<string>> result;
        for(auto & pair : hashmap){
            result.emplace_back(pair.second);
        }
        return result;
    }
};
C++相关语法: <veector> 头文件中的emplace_back函数

emplace_back 是 C++ 标准库中 vector 容器的一个成员函数,用于在 vector 的末尾就地构造并添加一个新元素。这个函数的特点是它可以直接在容器的内存空间内构造元素,避免了额外的复制或移动操作,因此效率更高。

在我的代码中,hashmap 是一个 unordered_map,其定义如下:

unordered_map<string, vector<string>> hashmap;

这意味着 hashmap 的键(key)是 string 类型,值(value)是 vector<string> 类型。

当使用 hashmap[sortedStr] 时,你正在访问 hashmap 中与 sortedStr 键关联的值,这个值就是 vector<string> 类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值