LeetCode49:字母异位词分组

题目:

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

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

示例 1:

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

输入: strs = [""]
输出: [[""]]
示例 3:

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

提示:

1 <= strs.length <= 10000
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

思路一:哈希表+排序,我们知道每个异位词是长度、字符相同,但是顺序不同;我们可以建立一个map数组,将排完序的字符串作为key值,而原来的strs数组是value值,如果strs排完序相同的,都是同一个key值,所以返回的也是一个异位词数组。

思路二:暴力解法,我们建立一个string容器vet,用来装排完序的strs字符串,vet和strs数组的区别就是每个字符串的字母顺序不同,但是下标相同。用两个for()把vet字符串数组相同元素的push_back()在二维string数组path中,最后直接返回path数组。

思路一完整代码:

class Solution
{
public:
    vector<vector<string>> groupAnagrams(vector<string> &strs)
    {
        unordered_map<string,vector<string>>mymap;
        vector<vector<string>>ans;
        for(int i=0;i<strs.size();i++)
        {
            string st=strs[i];
            sort(st.begin(),st.end());
            mymap[st].push_back(strs[i]);
        }
        for(unordered_map<string,vector<string>>::iterator it=mymap.begin();it!=mymap.end();it++)
        {
            ans.push_back(it->second);
        }
        return ans;
    }
};

思路二完整代码:

class Solution
{
public:
    vector<vector<string>> groupAnagrams(vector<string> &strs)
    {
        vector<string> vets;
        vector<string> vs;
        vector<vector<string>>path;
        for(int i=0;i<strs.size();i++)
        {
            string str=strs[i];
            sort(str.begin(),str.end());
            vets.push_back(str);          //其实这里就相当于用两个数组表示map的底层原理。
        }
        for(int i=0;i<vets.size();i++)
        {
            vs.push_back(strs[i]);
            for(int j=0;j<vets.size();j++)
            {
                if(vets[i]==vets[j]&&i!=j)
                {
                    vs.push_back(strs[j]);
                }
            }
            sort(vs.begin(),vs.end());  //因为两个for()中有重复的添加元素,所以直接按顺序存放在path数组中,为了下面的path.erase()
            path.push_back(vs);
            vs.clear();         //每次vs的情况都是为了数据溢出
        }
        sort(path.begin(),path.end());
        path.erase(unique(path.begin(),path.end()),path.end());
        return path;
    }
};

本道题的思路就是这样了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北方以南ccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值