本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1582. 买还是不买
原题传送:AcWing 1582. 买还是不买
伊娃需要若干颜色的若干珠子来制作一条她喜欢的手链。
因此,她去往一家小商店购买珠子。
商店里的珠子都是一整串串起的,里面包含各种颜色的珠子。
已知,商店每串珠子都不拆开售卖,只能整串购买。
伊娃想知道如果她购买一串商店的珠子,里面能否包含她需要的所有珠子。
如果能包含她需要的所有珠子,则回答 Yes,并输出她购买的多余的珠子的数量。
如果不能包含她需要的所有珠子,则回答 No,并输出她还缺少的珠子的数量。
为了简单起见,我们用数字 ,以及大小写字母 来表示珠子的颜色。
例如,下图中的第三串珠子就是伊娃想要串成的成品。
那么购买第一串珠子就可以达成目的,因为它包含了所有必要的珠子以及 个多余的珠子。
但是购买第二串珠子就不行,因为里面没有黑色珠子,并且少了一个红色珠子。
输入格式
共两行,第一行包含一个字符串表示商店的珠子串。
第二行包含一个字符串表示伊娃想要串成的珠子串。
输出格式
输出共一行。
如果能包含她需要的所有珠子,则回答 Yes,并输出她购买的多余的珠子的数量。
如果不能包含她需要的所有珠子,则回答 No,并输出她还缺少的珠子的数量。
回答和数量之间用一个空格隔开。
数据范围
两个字符串的长度都不超过 。
输入样例1:
ppRYYGrrYBR2258
YrR8RrY
输出样例1:
Yes 8
输入样例2:
ppRYYGrrYB225
YrR8RrY
输出样例2:
No 2
思路:
记录商店的珠子每种颜色的数量,然后遍历伊娃的珠子,如果数量不够则不能包含。
题解:
#include<bits/stdc++.h>
using namespace std;
unordered_map<char, int> mp;
int main()
{
int cnt = 0, sum = 0;
string s, t;
cin >> s >> t;
for(int i = 0; i < s.length(); i++)
{
mp[s[i]]++;
}
for(int i = 0; i < t.length(); i++)
{
if(mp[t[i]])
mp[t[i]]--;
else
cnt++;
}
if(cnt)
cout << "No" << " " << cnt;
else
{
for(auto e : mp)
sum += e.second;
cout << "Yes" << " " << sum;
}
return 0;
}