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



我对这个问题的解决方案有疑问,如下所述-

给定一个任意的赎金单字符串和另一个包含所有杂志信件的字符串,如果赎金单可以从杂志中构建,则编写一个函数,该函数将返回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条件中缺少的内容。有人能帮我在第一段代码中说明我做错了什么吗。感谢您的帮助。

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;

相关内容

最新更新