文章目录
- 1 题目
- 2 解析
- 2.1 题意
- 2.2 思路
- 3 参考代码
- 3.1 用map
- 3.2 不用map
1 题目
乒乓球筐
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?
输入描述:
输入有多组数据。
每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。
字符串长度不大于10000。
输出描述:
每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”。
输入例子:
ABCDFYE CDE
ABCDGEAS CDECDE
输出例子:
Yes
No
2 解析
2.1 题意
见题目
2.2 思路
map映射统计个数,每组数据开始时,需要清空上一次残留的数据。
3 参考代码
3.1 用map
#include
#include
#include
#include
using std::cin;
using std::string;
using std::map;
map<char, int>t1;
map<char, int>t2;
int main(int argc, char const *argv[]){
string A, B;
while(cin >> A >>B){
t1.clear();
t2.clear();
int j;
for (j = 0; j < B.length(); ++j) {//查找A中有没有B中的元素
if(A.find(B[j]) == string::npos){
printf("No\n");
break;
}
}
if(j == B.length()){//如果B中元素A都有
for (int i = 0; i < A.length(); ++i) {//统计A中每个元素出现的个数
if(t1.find(A[i]) != t1.end()){
t1[A[i]]++;
}else{
t1[A[i]] = 1;
}
}
for (int i = 0; i < B.length(); ++i) {//统计B中每个元素出现的个数
if(t2.find(B[i]) != t2.end()){
t2[B[i]]++;
}else{
t2[B[i]] = 1;
}
}
bool flag = true;
for (map<char, int>::iterator it = t2.begin(); it != t2.end(); ++it) {
if(it->second > t1[it->first]){//如果B中个数大于A中的个数
printf("No\n");
flag = false;
break;
}
}
if(flag == true){
printf("Yes\n");
}
}
}
return 0;
}
3.2 不用map
#include
#include
int main()
{
char a[10001];
char b[10001];
int numA[26];
int numB[26];
while (scanf("%s %s",a,b) != EOF){
for(int i=0;i<26;i++){
numA[i]=0;
numB[i]=0;
}
int lena=strlen(a);
int lenb=strlen(b);
for (int i = 0; i < lena; i++){
numA[a[i] - 'A']++;
}
for (int i = 0; i < lenb; i++){
numB[b[i] - 'A']++;
}
int flag = 0;
for (int i = 0; i < 26; i++){
if (numA[i]<numB[i]){
flag = 1;
break;
}
}
if (flag == 0){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}