PAT乙级(Basic Level)练习题 乒乓球筐

题目描述
nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?

输入描述:
输入有多组数据。
每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。
字符串长度不大于10000。

输出描述:
每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”。

输入例子:

ABCDFYE CDE
ABCDGEAS CDECDE

输出例子:

Yes
No

\color{blue}解题思路:
  首先遍历一遍字符串1,使用数组记录字符串1中字母的种类、个数,table[0]表示字符串1中字符'A'出现的次数,table[1]表示字符串1中字符'B'出现的次数,以此类推…
  然后访问一遍字符串2,把出现的字符在table中计-1,比如table[str2[i]] -= 1,如果出现table[str2[i]] < 0,说明字符串2出现了字符串1中未出现的字符,或者数量少。

\color{blue}代码实现:

#include <iostream>
#include <string.h>
using namespace std;

int main() {
    char str1[10001] = {'\0'}, str2[10001] = {'\0'};
    //scanf函数范围值为正确获取到数据的参数个数,当没有输入返回-1
    while (scanf("%s %s", str1, str2) != -1){
        int table[26] = {0};
        //统计字符串1中各个字母出现的次数
        for (int i = (int)strlen(str1); i >= 0; --i) {
            table[str1[i] - 'A'] += 1;
        }
        bool flag = true;
        //逐一减去字符串2中各个字符出现的次数
        for (int i = (int)strlen(str2); i >= 0; --i) {
            if (--table[str2[i] - 'A'] < 0) {
                //出现负数,说明字符串2出现了字符串1中未出现的字符,或者数量少
                flag = false;
                break;
            }
        }
        printf("%s\n", (flag ? "Yes" : "No"));
    }
    return 0;
}

在这里插入图片描述

发布了1009 篇原创文章 · 获赞 273 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104712149