LeetCode One Question of the Day (61) 49. Agrupación de palabras alfabéticas (Hash + emplace_back)

49. Agrupación de palabras de letras extraterrestres


Inserte la descripción de la imagen aquí


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;
    }
};

Inserte la descripción de la imagen aquí


En el desarrollo de C ++, a menudo usaremos operaciones de inserción para operar varios contenedores stl, como vector, mapa, conjunto, etc. Antes de la introducción de las referencias de rvalue, los constructores de transferencia, los operadores de copia de transferencia, generalmente usan push_back () para agregar un elemento rvalue (objeto temporal) al contenedor, primero llame al constructor para construir el objeto temporal y luego necesita llamar a la construcción de la copia La función coloca este objeto temporal en el contenedor. Se liberan las variables temporales originales. El problema causado por esto es el desperdicio de recursos de aplicaciones variables temporales.
Se introdujeron las referencias rvalue, después del constructor de transferencia, el constructor y el constructor de transferencia se llamarán cuando push_back () rvalues. Si se puede construir directamente al insertar, solo necesita construirse una vez. Esto es lo que agregó 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;
    }
};

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_45021180/article/details/111159580
Recomendado
Clasificación