到底买不买(PAT)
题目描述
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;ppRYYGrrYB225不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
输入描述:
每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。
输出描述:
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。
输入例子:
ppRYYGrrYBR2258
YrR8RrY
输出例子:
Yes 8
题意:
给定两个字符串,分别用不同的字符代表不同颜色的珠子,字符出现的次数代表珠子的数量。问串1是否都包含了串2所出现的字符以及对应的数量,若是输出Yes,并输出多余字符数量。反之输出No,并输出缺少的字符数量。
解题思路:
使用Hash,将串1出现的各字符对应的数量进行累加存储。遍历串2,减去串2出现的各字符数量。若Hash表内存在负数,则说明店家给的珠子缺少一部分,输出No,反之输出Yes。而数组总体距离0的差值即为缺少或多余的珠子数量。
源代码:
#include <iostream>
#include <string>
using namespace std;
const int N = 257;
int Num[N]; //Hash存储各类珠子数目(以字符表示珠子颜色,字符取值0-256,故开数组257)
int main()
{
string Str1; //店主给的珠串
cin >> Str1;
//遍历摊主给的珠串,统计各类珠子数目
for(int i = 0; i < Str1.size(); i++) {
Num[Str1[i]]++; //对应珠子种类+1
}
string Str2; //小红要的珠串
cin >> Str2;
//遍历小红想要的珠串,每个珠子数目-1,若为负数,则缺少,若为非负数,则满足小红要求珠子条件
for(int i = 0; i < Str2.size(); i++) {
Num[Str2[i]]--; //对应珠子种类的数目-1
}
int neg = 0; //总负数珠子数目 - 缺失数目
int pos = 0; //总正数珠子数目 - 多余数目
for(int i = 0; i <= 256; i++)
if(Num[i] < 0) neg += Num[i]; //统计缺少珠子
else if(Num[i] > 0) pos += Num[i]; //统计多余珠子
neg = -neg; //负数转正
//判断是否缺少珠子,输出结果
if(neg) cout << "No " << neg;
else cout << "Yes " << pos;
return 0;
}
若对于上述解法存有疑问,欢迎各位大佬评论区指出!本新人博主将和大家一起参与讨论学习!
该篇博客主要介绍了如何解决一个珠子匹配问题,即判断店主提供的珠串是否包含并超过小红想要的珠串所需的所有珠子。通过使用哈希表统计每种颜色珠子的数量,判断并计算多余或缺失的珠子,最终确定购买决策。文章提供了详细的解题思路和C++代码实现。
311

被折叠的 条评论
为什么被折叠?



