问题:
本题要求你计算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!
方法:
一看到两个字符串,我就想到这个题目可以用双重循环,但是双重循环的时间复杂度大,为O(n^2),但是这个字符串的长度都不超不过10^4方,所以时间复杂度最大10^8方,我在想会不会通过不了,但是最后我通过了,哈哈哈哈,其实呢,这个题目可以用一个单重循环做,能够很好的降低时间复杂度,优化代码,但是要注意要用一个bool类型或者flag进行判断,或者用这个函数unordered_map做,话不多说,上代码!
代码展示:
代码1:用bool类型做,C语言没有bool类型,Java有,C++也有,其实这个bool类型的变量,可以理解成C语言里的flag标志
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main() {
string a, b, c = "";
getline(cin, a);
getline(cin, b);
for (int i = 0; i < a.length(); i++) {
bool f = 0;
for (int j = 0; j < b.length(); j++) {
if (a[i] == b[j]) f = 1;
}
if (f == 0) c = c + a[i];
}
cout << c << endl;
return 0;
}
代码2:用unordered_map做,这个只要几行代码就能解决,因为我老师以前教我用这个方法做过PAT上的题,所以我就用这个方法做这个题目啦
#include<iostream>
#include<string>
#include<cctype>
#include<unordered_map>
using namespace std;
int main() {
string a, b;
getline(cin, a);
getline(cin, b);
unordered_map<char, bool> mp;
for (auto c : b) mp[c] = true;
for (auto c : a) {
if (!mp[c]) cout << c;
}
}
代码三:其实这三个代码的思路差不多,都是设置一个判点
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
bool f[260];
using namespace std;
int main() {
string str1, str2;
getline(cin, str1);
getline(cin, str2);
char a[10001];
int length1 = str2.length();
for (int i = 0; i < length1; i++) {
char c = str2[i];
f[c] = true;
}
int length2 = str1.length();
for (int i = 0; i < length2; i++) {
char c = str1[i];
if (!f[c]) cout << str1[i];
}
}
加油哦,祝大家好运!