PAT(Advanced) 1092 To Buy or Not to Buy C++实现
题目链接
题目大意
给定字符串和目标字符串,若给定字符串中包含目标字符串中所有的字符,则输出Yes
并输出给定字符串中多余的字符的个数,否则输出No
并输出除去给定字符串包含的字符后目标字符串中仍缺少的字符串的个数。
算法思路
借助C++ STL
容器unordered_map
,将给定字符串和目标字符串中所有的字符计数,遍历目标字符串中的字符计数值,与给定字符串的字符计数值做差运算,最后若目标字符串中已经没有字符则说明满足条件输出给定字符串中多余的字符个数,否则输出目标字符串中缺少的个数。本题map
容器一样可以实现,map
容器基于红黑树,迭代器遍历结果为有序序列,而unordered_map
容器基于哈希表,迭代器遍历结果为无序序列,本题不要求迭代结果的有序,使用unorder_map
会更快,unorder_map
要求编译器版本高于C++ 11
标准。
AC代码
/*
author : eclipse
email : eclipsecs@qq.com
time : Fri Jan 29 16:46:04 2021
*/
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[]) {
string givenString;
string targetString;
cin >> givenString >> targetString;
unordered_map<char, int> givenBeadsCount;
unordered_map<char, int> targetBeadsCount;
for (int i = 0; i < givenString.size(); i++) {
if (givenBeadsCount.count(givenString[i])) {
givenBeadsCount[givenString[i]]++;
} else {
givenBeadsCount[givenString[i]] = 1;
}
}
for (int i = 0; i < targetString.size(); i++) {
if (targetBeadsCount.count(targetString[i])) {
targetBeadsCount[targetString[i]]++;
} else {
targetBeadsCount[targetString[i]] = 1;
}
}
int givenStringRest = givenString.size();
int targetStringRest = targetString.size();
for (unordered_map<char, int>::iterator it = targetBeadsCount.begin(); it != targetBeadsCount.end(); it++) {
if (givenBeadsCount.count(it->first)) {
if (givenBeadsCount[it->first] >= it->second) {
givenStringRest -= it->second;
targetStringRest -= it->second;
} else {
givenStringRest -= givenBeadsCount[it->first];
targetStringRest -= givenBeadsCount[it->first];
}
}
}
printf("%s %d", targetStringRest == 0 ? "Yes" : "No", targetStringRest == 0 ? givenStringRest : targetStringRest);
return 0;
}
样例输入1
ppRYYGrrYBR2258
YrR8RrY
样例输出1
Yes 8
样例输入2
ppRYYGrrYB225
YrR8RrY
样例输出2
No 2
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!