LeetCode每日一题 (61) 49. 字母异位词分组 (哈希+emplace_back)

49. 字母异位词分组


LeetCode每日一题 (61) 49. 字母异位词分组 (哈希+emplace_back)_第1张图片


class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        map<string,int> position; //纪录同一类别的位置
        vector<vector<string>> result; //结果
        int len=0;

        for(int i=0;i<strs.size();i++){
            string temp=strs[i];
            sort(temp.begin(),temp.end());
            //判断position里面是否有位置信息,没有就需要新增一个[]
            if(position.count(temp)==0){ 
                vector<string> x;
                result.push_back(x);
                position[temp]=len;
                len++;
            }
            result[position[temp]].push_back(strs[i]);
        }
        return result;
    }
};

LeetCode每日一题 (61) 49. 字母异位词分组 (哈希+emplace_back)_第2张图片


c++开发中我们会经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等。在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。
引入了右值引用,转移构造函数后,push_back()右值时就会调用构造函数和转移构造函数,如果可以在插入的时候直接构造,就只需要构造一次即可。这就是c++11 新加的emplace_back

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> mp;
        for (string& str: strs) {
            string key = str;
            sort(key.begin(), key.end());
            mp[key].emplace_back(str);
        }
        vector<vector<string>> ans;
        for (auto it = mp.begin(); it != mp.end(); ++it) {
            ans.emplace_back(it->second);
        }
        return ans;
    }
};

LeetCode每日一题 (61) 49. 字母异位词分组 (哈希+emplace_back)_第3张图片

你可能感兴趣的:(战胜LeetCode刷题,leetcode)