LeetCode49. 字母异位词分组 哈希表 中等难度

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 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/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

前置知识

  • vector<vector<string>> ans;//声明ans容器,这里采用双层向量形式。 如何给ans赋初始值
    可以使用vector<vector<string>> ans(5,vector<string>(10));
    不可以使用vector<vector<string> >a(5,10)来直接改变默认值,因为此时赋值是利用int赋值给vector(说人话就是本来单维vector直接使用是正确赋值,可以理解成int赋值给int)此处参照双层vector的运用细节

  • ans.emplace_back(str);//这里的emplace_back与push_back功能一样,不过emplace_back会更快一些,emplace_back是直接在list末尾创建一个新的str,而push_back是先创建一个新str,再拷贝或者移动到ans末尾(拷贝完成会自动销毁),执行效率低一些。详细解释可以参照谈谈c++11 emplace_back

  • sort(str.begin(),str.end());//对字符串str按字母大小排序,比如tea排序后为aet

  • for(auto str : strs)是利用str生成strs中每一个值的复制,对str的赋值不会影响到原容器。
    for(auto & str : strs)是利用str生成strs中每一个值的引用,对x的操作影响到原容器。

代码

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> ans;
        //对于这道题中的vector<string> strs我不知道怎么处理,
        /*目前的思路是将str中的每个单词取出,利用sort将单词
        按字母大小排序,分别插入哈希表中,如果匹配则哈希表加1,
        匹配完成后,再对哈希表用for循环,每一个单词,对应strs中
        有相同的单词数可以相符,最后时间为O(n^2),感觉题解不是
        这样的,哈希表起到的作用没有那么大
        */

        /*
        官方题解思路和上面类似,但是区别在于哈希表中,键对应的是
        该单词排序后的字母,值对应的是strs中这些字母组成的单词,
        比我的思路好很多。
        估计是我对力扣中的哈希表的形式理解还不透彻导致
        */
        unordered_map<string,vector<string>> mp;
        for(auto & str:strs)//这里的引用似乎没有啥用,去掉也成
        {
            string key=str;
            sort(key.begin(),key.end());
            mp[key].emplace_back(str);
        }
        for(auto str:mp)
        {
            ans.emplace_back(str.second);
        }
        return ans;
    }

};

总结

大致思路是对的,但是对于哈希表的使用还是不熟。还是得不断努力啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值