Given two strings S1 and S2, S=S1−S2 is defined to be the remaining string after taking all the characters in S2 from S1 . Your task is simply to calculate S1−S2 for any given strings. However, it might not be that simple to do it fast.
Input Specification:
Each input file contains one test case. Each case consists of two lines which gives S1 and S2, respectively. The string lengths of both strings are no more than 10^4
. It is guaranteed that all the characters are visible ASCII codes and white space, and a new line character signals the end of a string.
Output Specification:
For each test case, print S1−S2 in one line.
Sample Input:
They are students.
aeiou
Sample Output:
Thy r stdnts.
题目思路:
- 利用SLT(标准语言模板,引入特殊数据结构集合),存放s2里面的所有字符
- 遍历s1里面的所有字符,如果出现在s2里面则不输出
(容易TLE的点)
#include <iostream>
#include <unordered_set>
using namespace std;
int main(){
string s1, s2;
unordered_set<char> s2_set;
getline(cin, s1);
getline(cin, s2);
for(int i = 0; i < s2.length(); i++){
s2_set.insert(s2[i]);
}
for(int i = 0;i < s1.length(); i++){
if(!s2_set.count(s1[i])) //count()方法用于检查元素在哈希表中出现的次数
cout << s1[i];
}
return 0;
}
改良代码:
#include <iostream>
#include <unordered_set>
using namespace std;
string s1, s2;
int main()
{
getline(cin, s1);
getline(cin, s2);
unordered_set<char> hash;
for (auto c : s2) hash.insert(c); //老样子,新语法可以缩减代码量
string res;
for (auto c : s1)
if (!hash.count(c))
res += c;
cout << res << endl;
return 0;
}