乒乓球筐

前言

牛客网PAT乙级训练1028

题目描述

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

输入描述

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

输出描述

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

输入例子

ABCDFYE CDE
ABCDGEAS CDECDE

输出例子

Yes
No

解析

阅读完题目后发现解出此题只需要两步:

  1. 求出A、B两个字符串中每个字符出现的次数
  2. 比较每个字符出现的次数
    因此,只要围绕这两个问题逐一攻破即可。

对于第一个问题
需要提前声明两个长度位26的数组,arrA[]和arrB[],分别用来存储字符串A和B中a-z出现的次数,例如

arrA[0]==1

就表示字母a再字符串A中出现了1次。
这样做的好处就是比较A、B中对应的字符出现的次数时变得很容易,只需要下面的代码就可以了:

boolean flag = true;
for (int i = 0; i < 26; i++) {
      if (arrA[i] < arrB[i]) {
              flag = false;
              break;
        }
}

因此,第二个问题也就迎刃而解了。

解决方案

以下是本题的其中一个解法:

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String A = scanner.next();
            String B = scanner.next();

            int arrA[] = new int[26];
            int arrB[] = new int[26];

            for (int i = 0; i < A.length(); i++) {
                arrA[A.charAt(i) - 'A']++;
            }

            for (int i = 0; i < B.length(); i++) {
                arrB[B.charAt(i) - 'A']++;
            }

            boolean flag = true;
            for (int i = 0; i < 26; i++) {
                if (arrA[i] < arrB[i]) {
                    flag = false;
                    break;
                }
            }

            if (flag) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }
}

你可能感兴趣的:(乒乓球筐)