PAT 1039 到底买不买 巧用STL map 和 set

最近在准备复试的机试,在刷PAT乙,在此对此题新学到的STL知识稍作总结

map<char, int>::iterator it;
it->first;//访问键
it->second;//访问值

// 通用的容器遍历代码---使用迭代器
set<char> myset;
for (set<char>::iterator it = myset.begin(); it != myset.end(); it++) {
	cout << *it << endl;
}

题目

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

输入格式:
每个输入包含 1 个测试用例。每个测试用例分别在 2 行中先后给出摊主的珠串和小红想做的珠串,两串都不超过 1000 个珠子。

输出格式:
如果可以买,则在一行中输出 Yes 以及有多少多余的珠子;如果不可以买,则在一行中输出 No 以及缺了多少珠子。其间以 1 个空格分隔。

#include
#include
#include
#include
#include
#include
#include
using namespace std;

int main() {
	string str1, str2;
	cin >> str1 >> str2;
	map<char, int> mp;
	// 初始化映射
	
	for (int i = 0; i < 10; i++) {
		mp[i + '0'] = 0;
	}
	for (int j = 0; j < 27; j++) {
		mp[j + 'a'] = 0;
		mp[j + 'A'] = 0;
	}
	
	for (int i = 0; i < str1.length(); i++) {
		mp[str1[i]]++;
	}

	set<char> myset;
	bool all_in = true;

	for (int j = 0; j < str2.length(); j++) {
		if(all_in)
			if (!mp[str2[j]]) {
				all_in = false;
			}
		myset.insert(str2[j]);
		mp[str2[j]]--;
		
	}

	int ssum = 0;

	if (all_in) {
		for (map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
			ssum += it->second;
		}
		cout << "Yes " << ssum;
	}
	else {
		for (set<char>::iterator it = myset.begin(); it != myset.end(); it++) {
			if (mp[*it] < 0)
				ssum -= mp[*it];
		}
		cout << "No " << ssum;
	}
	return 0;
}

你可能感兴趣的:(c++,算法,开发语言)