【发布时间】:2020-08-18 01:56:08
【问题描述】:
我对下面说明的这个问题的解决方案有疑问-
给定一个任意的赎金票据字符串和另一个包含所有杂志字母的字符串,编写一个函数,如果可以从杂志构造赎金票据,则该函数将返回true;否则,它将返回 false。
杂志字符串中的每个字母只能在您的赎金票据中使用一次。 根据问题,Strings["aa", "ab"] 应该返回 false,strings["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 条件中缺少的内容。谁能帮我说明我在第一个代码中做错了什么。任何帮助表示赞赏。
【问题讨论】:
-
我不确定,因为我无法理解您的解释,但
umap.count(r)<=1对于r的任何值都将始终为真。unordered_map::count总是返回 0 或 1。也许你的意思是if (umap.count(r) == 0),但很难说。 -
“如果没有密钥,我已经使用
umap.count(r)<=1返回 false。” - 不,你没有。umap.count(r)<=1总是正确的。想想为什么。r要么存在 (1),要么不存在 (0)。两者都是 umap.count(r) == 0,实际上,应该只使用迭代器,这样就不必执行两次搜索(一次用于查找;一次用于递减)。 -
@john @WhozCraig 我试过使用
if (umap.count(r) == 0),但它仍然返回true。它现在应该返回 false。我不明白这个逻辑有什么问题。 -
umap.count仅在密钥不存在时返回 0。如果 key 存在但 value 为 0(当你用完一个字符的所有副本时),它仍然会返回 1。你似乎对count函数的作用有误解。 -
@BessieTheCow 感谢您的解释,我明白为什么
if (umap.count(r) == 0)返回的是 true 而不是 false。
标签: c++ c++11 stl hashmap unordered-map