0
点赞
收藏
分享

微信扫一扫

乒乓球筐————hash映射(可用map)


文章目录

  • ​​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;
}

举报

相关推荐

0 条评论