题目描述
nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?
输入描述:
输入有多组数据。
每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。
字符串长度不大于10000。
输出描述:
每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”。
输入例子:
ABCDFYE CDE
ABCDGEAS CDECDE
输出例子:
Yes
No
首先遍历一遍字符串1
,使用数组记录字符串1
中字母的种类、个数,table[0]
表示字符串1
中字符'A'
出现的次数,table[1]
表示字符串1中字符'B'
出现的次数,以此类推…
然后访问一遍字符串2
,把出现的字符在table
中计-1,比如table[str2[i]] -= 1
,如果出现table[str2[i]] < 0
,说明字符串2
出现了字符串1中未出现的字符,或者数量少。
#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;
}