L1-011 A-B(PTA天梯赛)
本题要求你计算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
栈限制
8192 KB
我的思路:这道题如果使用标记元素然后输出的时候选择跳过输出就可以非常简单的完成(代码会放下面的),但是我们如果想用其他的写法哪怕复杂一点,那么可以使用c++的<unordered_set>这个头文件中的unordered_set这个无序集合容器。
这个集合的特点是:
1、无序的(基于哈希表实现的)
2、无重复性(自动去除重复元素)
3、高效查找性
利用.find()与.end()对比来完成快速的查找,存储方式是.insert();就是插入元素。掌握这些就足够了。
解法一:利用查找元素并标记,输出的时候跳过标记点完成输出
#include <bits/stdc++.h>
using namespace std;
int main (void) {
string A,B;
getline(cin,A);
getline(cin,B);
for(int i=0;i<A.size();i++){
for(int j=0;j<B.size();j++){
if(A[i]==B[j]){
A[i]='-';//这里就是利用负号完成标记,利用其他符号也是可以的
break;
}
}
}
for(int i=0;i<A.size();i++){
if(A[i]!='-'){//遇到非标记元素(这里就是非负号的时候输出)
cout<<A[i];
}
}
return 0;
}
解法二:利用unordered_set<char> 字符类型的无序集合进行快速查找,然后记录非重复的字符,最后完成输出。
// #include<bits/stdc++.h>//写万能头文件其实是比较舒服的
#include<iostream>
#include<unordered_set>//这个就是无序集合unordered_set的头文件
using namespace std;
string sub(const string &s1,const string &s2){//这里使用的常量引用类型,这样可以省去拷贝的时间和防止修改
string s;
unordered_set<char> ss;
for(char x:s2){
ss.insert(x);
}
for(char x:s1){//范围for循环,完成对无序集合的遍历
if(ss.find(x)==ss.end()){//根据find()返回的数据进行判断是否找到重复的元素了
s+=x;
}
}
return s;
}
int main(){
string s1,s2;
getline(cin,s1);
getline(cin,s2);
cout<<sub(s1,s2);
}
到这里就结束啦!!!
笨蛋也是可以努力变强的呢,再努力一点!!!!
欢迎小伙伴们评论区讨论,提问。
我是荒古前,期待你的关注~~~
~~~完结撒花✌y( •̀ ω •́ )y✌~~~