std :: unordered_map :: count не работает в моем коде - PullRequest
0 голосов
/ 03 мая 2020

У меня есть сомнение в решении этого вопроса, который сформулирован ниже -

Учитывая произвольную строку примечания с требованием выкупа и другую строку, содержащую буквы из всех журналов, напишите функцию, которая будет возвращать true, если выкуп заметка может быть построена из журналов; в противном случае он вернет false.

Каждая буква в строке журнала может использоваться только один раз в вашей записке с требованием выкупа. Строки ["aa", "ab"] должны возвращать false, а строки ["aa", "aab"] должны возвращать true в соответствии с вопросом.

Вот код, который я попытался в первую очередь и Я не получаю требуемый вывод, как упомянуто выше.


        unordered_map<char,int>umap;

        for(char m:magazine)
        {
            umap[m]++;
        }

        for(char r:ransomNote)
        { 
            if(umap.count(r)<=1)
            {
                return false;
            }
            else{
                umap[r]--;
            }


        }
       return true; 
    }

В приведенном выше коде я использовал umap.count(r)<=1 для возврата false, если ключа нет. Для строк ["aa", "aab"] он возвращает значение true, но для строк ["aa", "ab"] он также возвращает значение true, но он должен возвращать значение false. Затем я использовал другой способ решения этой проблемы, используя umap[r]<=0 вместо umap.count(r)<=1, и он работает просто отлично, в остальном весь код такой же.

bool canConstruct(string ransomNote, string magazine) {

        unordered_map<char,int>umap;

        for(char m:magazine)
        {
            umap[m]++;
        }

        for(char r:ransomNote)
        { 
            if(umap[r]<=0)
            {
                return false;
            }
            else{
                umap[r]--;
            }


        }
       return true; 
    }

Я не могу получите то, что мне не хватает в условии if первого кода. Может кто-нибудь помочь мне заявить, что я делаю неправильно в первом коде. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 03 мая 2020

unordered_map::count возвращает количество элементов с указанным ключом.

Поскольку вы не используете multi_map версию, у вас есть только 0 или 1.

Связанное значение не изменить наличие ключа на карте.

Чтобы использовать count, вы должны удалить ключ, когда значение достигнет 0:

for (char r : ransomNote) {
    if (umap.count(r) == 0) {
        return false;
    } else {
        if (--umap[r] == 0) {
            umap.erase(r);
        }
    }
}
return true;
...