Преобразование вектора символов в вектор строк в C ++ - PullRequest
1 голос
/ 01 ноября 2019

для следующей задачи мне нужно вернуть вектор строк, где каждый элемент вектора имеет длину 1. У меня есть ответ, который генерирует вектор символов. Я думаю, что он делает то, что мне нужно, но я не уверен, как вернуть результат как вектор строк длины один. Смотрите мою реализацию ниже. Обратите внимание, я не могу изменить тип возвращаемого значения функции, это должен быть вектор строк. Учитывая, что я работаю с персонажами в своем решении, я не уверен, как бы я его изменил.

    vector<string> commonChars(vector<string>& A) {
        vector<char> resVec;
        unordered_map<char, int> mapObj;

        for (const auto& str : A) {
            for (const auto& letter : str) {
                mapObj[letter]++;
            }
        }

        int sizeOfInput = A.size();
        for (int i{}; i < A[0].size(); i++) {
            if (!mapObj.count(A[0][i])) continue;
            resVec.insert(resVec.begin(), mapObj[(A[i])] / sizeOfInput, A[i]); 
        }
        return resVec;
    }

Ответы [ 3 ]

1 голос
/ 01 ноября 2019
std::vector<char> resVec;
...
std::vector<std::string> returnVec;
returnVec.reserve(resVec.size());
for (char ch : resVec) {
    returnVec.push_back(std::string(1, ch));
    // or: returnVec.emplace_back(1, ch);
}
return returnVec;

В качестве альтернативы:

std::vector<char> resVec;
...
std::vector<std::string> returnVec;
returnVec.reserve(resVec.size());
std::transform(resVec.begin(), resVec.end(), std::back_inserter(returnVec), 
    [](char ch){ return std::string(1, ch); }
);
return returnVec;

В качестве альтернативы:

std::vector<char> resVec;
...
std::vector<std::string> returnVec(resVec.size());
std::transform(resVec.begin(), resVec.end(), returnVec.begin(), 
    [](char ch){ return std::string(1, ch); }
);
return returnVec;

Тем не менее, вы можете просто исключить std::vector<char> и просто заполнить окончательный std::vector<std::string> непосредственно изstd::map данные:

std::vector<std::string> commonChars(std::vector<std::string>& A) {
    std::vector<std::string> resVec;
    std::unordered_map<char, int> mapObj;

    for (const auto& str : A) {
        for (const auto& letter : str) {
            mapObj[letter]++;
        }
    }

    size_t sizeOfInput = A.size();
    if (sizeOfInput > 0) {
        for (const auto& letter : A[0]) {
            auto iter = mapObj.find(letter);
            if (iter != mapObj.end()) {
                resVec.insert(resVec.begin(), iter->second / sizeOfInput, std::string(1, letter));
            }
        }
    }

    return resVec;
}
0 голосов
/ 01 ноября 2019

Есть другой способ решения проблемы. Вы можете посчитать вхождения каждой буквы az в векторе для каждой строки и пройтись по каждому вектору, добавив минимальное число раз, когда символ встречается во всех строках:

vector<string> commonChars(vector<string>& A) {
    const int maxTimes=100;
    vector<string> resVec;
    vector<vector<int>> counts;
    counts.reserve(A.size());

    //Count occurrences of letters in each string
    for (const auto& word : A) {
        vector<int> count(26, 0);
        for (const auto letter : word) {
            count[letter-'a']++;
        }
        counts.push_back(count);
    }

    //Add minimum number of times a letter occurs in all strings
    for (int i=0; i<26; ++i)
    {
        int min=maxTimes;
        for (auto &count : counts)
        {
            if (count[i] < min) {
                min = count[i];
            }
        }

        for (int j=0; j<min; ++j) {                 
            resVec.push_back(string(1, i+'a'));
        }
    }

    return resVec;
}

Примечание: string(1, i+'a') создаетстрока размера 1 из одного символа (значение: i + 'a').

0 голосов
/ 01 ноября 2019
vector<string> ret;
for(char ch: resVec)
    ret.push_back(string(1,ch));
return ret;

Это простой способ преобразования std::vector<char> в std::vector<std::string>. Если вам интересно, вы также можете взглянуть на: Преобразовать один символ в строку?

Короче говоря string(1,ch) - это то, что делает фактическое преобразование.

...