我对以下所述的问题的解决方案有疑问-
给出一个任意的赎金票据字符串和另一个包含所有杂志字母的字符串,编写一个函数,如果可以从杂志中构造赎金票据,则该函数将返回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条件下,我无法得到我所缺少的东西。谁能帮助我指出我在第一个代码中做错了什么。任何帮助表示赞赏。
答案 0 :(得分:0)
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;