题目
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
输入格式
每个输入包含 1 个测试用例。每个测试用例分别在 2 行中先后给出摊主的珠串和小红想做的珠串,两串都不超过 1000 个珠子。
输出格式
如果可以买,则在一行中输出 Yes 以及有多少多余的珠子;如果不可以买,则在一行中输出 No 以及缺了多少珠子。其间以 1 个空格分隔。
思路
差不多还是桶排序的思维,将店家有的和小红想要的各个珠子种类数量分别存在两个数组中。因为用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色,那么只需要开62位置的数组作为桶便可以装下了。
[数字存在count数组的前十位小写字母存在count数组的11]35位大写字母存在cout数组的3662位
然后遍历0~62找一找够还是不够,有一个不够就开始统计差了几个,不然就在最后输出s1,s2的长度差值。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
//如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子
string s1,s2;
int cnt;
int count1[100],count2[100];//也可以开的很大,这样后面可以全部直接存入,不需 -'0'等操作
//统计各个字符数字出现的次数
void countSize(string s,int count[]){
int len = s.size();
for(int i = 0;i < len; i++){
if(s[i] - '0' >= 0 && s[i] - '9' <= 0)
count[s[i] - '0']++;//数字存在count数组的前十位
else if (s[i] - 'a' >= 0 && s[i] - 'z' <= 0)
count[s[i] - 'a' + 10]++;//小写字母存在count数组的11~35位
else
count[s[i] - 'A' + 36]++;//大写字母存在cout数组的36~62位
}
}
int main() {
cin >> s1 >> s2;
bool flag = 1;//1代表可以,否则为0
countSize(s1,count1);
countSize(s2,count2);
for(int i = 0; i < 62; i++){
if(count2[i] != 0 && count2[i] > count1[i]){
cnt += count2[i] - count1[i];
flag = 0;
}
}
if(!flag){
cout << "No " << cnt << endl;
}
else{
int len = s1.size() - s2.size();
cout << "Yes " << len << endl;
}
return 0;
}
你觉得这样太麻烦,不想去转化,也可以只开一个很大的数组,至少比Z的编码大,将店家的s1存入,再遍历小红的需求s2,找够还是不够。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
string s1,s2;
int count1[300];
int cnt;
int main(){
cin >> s1 >> s2;
//店家的存入
for (int i = 0; i < s1.length(); i++)
count1[s1[i]]++;
for(int i = 0; i < s2.size(); i++){
if(count1[s2[i]] > 0)
count1[s2[i]]--;//店家有这个珠子,减去一颗
else
cnt++;//店家没有,那么统计一下不够的
}
if(!cnt){
int len = s1.size() - s2.size();
cout << "Yes " << len << endl;
}
else
cout << "No " << cnt << endl;
return 0;
}