leetcode49. Group Anagrams

题目:题目链接

题目大意就是看哪些单词出现的字母一样,如果是就把他们放一起,不管其字母出现的顺序是否一样。
思路:用map记录下单词的字符串(是排序后的)。也就是说我们对于两个单词 acb和bac,把acb,bac排序,它们就都是abc,使用我们只需要记录abc出现就可以了。注意我们需要输出原单词,所以先用个中间变量保存单词再排序,这样原单词就不变了。看代码吧:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        int len = strs.size();
        vector<vector<string>> ans(len);
        unordered_map<string, int>unmp;//记录字符出现的位置
        int k = 0;//当前使用的ans大小
        for (auto& str : strs) {
            string tmp = str;
            sort(tmp.begin(), tmp.end());//按照字典序排序,不管是abc,还是bac,排序后都是abc,把abc记录到unmp中
            if (unmp.find(tmp) == unmp.end()) {//找不到,说明从未出现
                ans[k].push_back(str);//把原始的str放到答案中
                unmp[tmp] = k;//标记为出现
                k++;
            }
            else  ans[unmp[tmp]].push_back(str);//存在就直接加入就可以
        }
        ans.resize(k);//把多余的部分截断,因为初始大小是len,但合并之后实际使用大小可能会小于len
        return ans;
    }
};

也可以再优化一下,不需要截断。因为只有执行if才需要开辟新空间嘛。所以:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> ans;
        unordered_map<string, int>unmp;//记录字符出现的位置
        int k = 0;//当前使用的ans大小
        for (auto& str : strs) {
            string tmp = str;
            sort(tmp.begin(), tmp.end());//按照字典序排序,不管是abc,还是bac,排序后都是abc,把abc记录到unmp中
            if (unmp.find(tmp) == unmp.end()) {//找不到,说明从未出现
                ans.push_back(vector<string>{str});//把原始的str放到答案中
                unmp[tmp] = k;//标记为出现
                k++;
            }
            else  ans[unmp[tmp]].push_back(str);//存在就直接加入就可以
        }
        return ans;
    }
};

可以找找茬,其实就是修改了预先给ans分配len大小还有if中直接push_back的操作,最后用于截断的resize自然也不需要了。
加油加油!!加油加油加油!!!加油哦!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值