std::unordered_map::count 在我的代码中不起作用

std::unordered_map::count is not working in my code

我对下面说明的这个问题的解决方案有疑问 -

给定一个任意的赎金票据字符串和另一个包含来自所有杂志的字母的字符串,编写一个函数,如果赎金票据可以从杂志中构造出来,该函数将 return 为真;否则,它将 return false.

杂志字符串中的每个字母只能在您的赎金记录中使用一次。 根据问题,字符串 ["aa"、"ab"] 应该 return false 和字符串 ["aa"、"aab"] 应该 return 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 到 return false。 对于字符串 ["aa"、"aab"],它是 return,但对于字符串 ["aa"、"ab"],它也是 return ]ing 是真的,但它应该 return 是假的。 然后我用另一种方法来解决这个问题,只用 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 条件中丢失的内容。谁能帮我说明我在第一段代码中做错了什么。感谢任何帮助。

unordered_map::count returns 具有指定键的项目数。

因为你没有使用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;