L1-011 A-B题解~!

158 阅读2分钟

[PTA天梯赛 L1-011 A-B题解](题目详情 - L1-011 A-B (pintia.cn))

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

输出样例:

I lv GPLT!  It's  fn gm!

代码长度限制

16 KB

时间限制

150 ms

内存限制

64 MB

由题可知,题目的要求是做减法,而且A-B不是普通的减法,是两个字符串相减,我们可以想到,相减之意就是A-B中,B中有的所有字符,A中相应的字符都得减去,换句话说,就是B中有的字符,A都不能有,这样就好理解了

那该如何去做呢?

换种思路,就是B中有的字符,我们在A中不显示,直接跳过,这样就相当于删除了这个相同的字符,在这里我们可以用哈希表巧妙的避开这些字符

我们先将所有字符写入,记住包含空格!!!!这时候我们就要用到C++中的一个函数,可以连空格一起写入getline(cin,str);由于遇到回车才会停止,记住我们需要手动停止一下getchar(),输完之后,不然其他数据就无法正常输入

将B所有字符作为哈希表的键值存入

然后再用一个循环 用哈希表的count函数进行查询,查询A中是否有B中的字符,有值为1没有为0,这样我们就能一个个的进行排查,如果没有B中没有,就正常输出,有就直接跳过,这样这道题就迎刃而解了!

参考代码如下:

#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;

int main()
{
	string a;
	getline(cin,a);
	string b;
	getline(cin,b);
	unordered_map<int,int>m;
	for(int i=0;i<b.length();i++)
	{
		m[b[i]]=i;
	}
	
	for(int i=0;i<a.length();i++)
	{
		if(m.count(a[i]))
		continue;
		cout<<a[i];
	}
    cout<<endl;
}