问题描述
eva想用她最喜欢的颜色做一串珠子,她去了一家小店买了一些珠子。 有许多五颜六色的珠子串。 然而,商店只会将整个珠子串出售。 因此,伊娃必须检查商店中的字符串是否包含她需要的所有珠子。 她现在来找你帮忙:如果答案是“是”,请告诉她额外的数量必须买的珠子; 或者如果答案是“否”,请告诉她字符串中缺少的珠子数量。 为简单起见,让我们使用范围中的字符
[0-9],[a-z]和[A-Z]代表颜色。
输入:
第一行:商店的珠子串的颜色序列whole
第二行:eva所需要的珠子的颜色序列needs
输出:
如果答案是“是”,那么还输出Eva必须购买的额外珠子的数量;
即Yes 额外珠子数量
如果答案为“否”,则还输出字符串中缺少的珠子数less。
即No 缺少的珠子数。
答案和号码之间必须有1个空格。
解题思路:
将商店的序列和需要的序列分布都存在一个map中,得出每个序列中<颜色(key),颜色数(val)>
对于need_map中的每一种颜色key,判断whole_map中的key的val是否小于于need_map中的val,小于则答案为否,less += whole_val-need_val;
遍历完之后如果less>=0,则能满足条件,额外多买的珠子为whole.size()-need.size();
代码
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
int main() {
string whole, needs;
cin >> whole>> needs;
map<char, int> dic;
map<char, int> whole_dic;
int less = 0;
for (int i = 0; i < needs.size(); i++) {//需要的序列存入map中
if (dic.find(needs[i]) != dic.end()) {
dic[needs[i]]= dic[needs[i]] +1;
}
else {
dic.insert(pair<int, int>(needs[i], 1));
}
}
for (int i = 0; i < whole.size(); i++) {//售出的序列存入map
if (whole_dic.find(whole[i]) != whole_dic.end()) {
whole_dic[whole[i]] = whole_dic[whole[i]] + 1;
}
else {
whole_dic.insert(pair<int, int>(whole[i], 1));
}
}
map<char, int>::iterator it;
it = dic.begin();
while (it != dic.end())
{
if (whole_dic.find(it->first) == whole_dic.end()) {//判断商店售卖的某种颜色是否能满足需要的值
less += it->second;
}
else {
if (whole_dic[it->first] < it->second) {
less += it->second - whole_dic[it->first];
}
}
it++;
}
if (less != 0) {
cout << "No " << less << endl;
}
else {
cout << "Yes " << (whole.size()-needs.size()) << endl;
}
return 0;
}