题目
键盘上有些按键已经损坏了。
当你输入一些句子时,与坏掉的按键相对应的字符将不会出现在屏幕上。
现在给定你应该键入的字符串以及你实际键入的字符串,请找出哪些按键坏了。
输入格式
第一行包含应该键入的字符串。
第二行包含实际键入的字符串。
两个字符串中都只包含大小写英文字母,数字以及 _(表示空格)。
输出格式
共一行,按检测到的顺序,输出所有损坏的按键。
英文字母必须大写,每个损坏的按键只需要输出一次。
数据范围
给定字符串的长度均不超过 80。
保证至少有一个按键损坏。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
解法1:集合
时间复杂度O(n),空间复杂度O(n)
#include <iostream>
#include <unordered_set>
using namespace std;
string a, b;
unordered_set<char> sa, sb;
int main() {
cin >> a >> b;
for (auto c: b)
sb.insert(c);
for (auto c: a) {
if (sb.find(c) == sb.end()) {
if (c >= 'a' && c <= 'z')
c = 'A' + c - 'a';
if (sa.find(c) == sa.end()) {
sa.insert(c);
cout << c;
}
}
}
return 0;
}
解法2:双指针
时间复杂度O(n),空间复杂度O(n)
#include <iostream>
using namespace std;
string a, b;
bool st[256];
int main() {
cin >> a >> b;
b += '#';
for (int i = 0, j = 0; i < a.size(); i++) {
char x = toupper(a[i]), y = toupper(b[j]);
if (x == y) j++;
else if (!st[x]) {
cout << x;
st[x] = true;
}
}
return 0;
}