题目
键盘上有些按键已经损坏了。
当你输入一些句子时,与坏掉的按键相对应的字符将不会出现在屏幕上。
现在给定你应该键入的字符串以及你实际键入的字符串,请找出哪些按键坏了。
输入格式
第一行包含应该键入的字符串。
第二行包含实际键入的字符串。
两个字符串中都只包含大小写英文字母,数字以及 _(表示空格)。
输出格式
共一行,按检测到的顺序,输出所有损坏的按键。
英文字母必须大写,每个损坏的按键只需要输出一次。
数据范围
给定字符串的长度均不超过 80。
保证至少有一个按键损坏。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI

解法1:集合

时间复杂度O(n),空间复杂度O(n)

  1. #include <iostream>
  2. #include <unordered_set>
  3. using namespace std;
  4. string a, b;
  5. unordered_set<char> sa, sb;
  6. int main() {
  7. cin >> a >> b;
  8. for (auto c: b)
  9. sb.insert(c);
  10. for (auto c: a) {
  11. if (sb.find(c) == sb.end()) {
  12. if (c >= 'a' && c <= 'z')
  13. c = 'A' + c - 'a';
  14. if (sa.find(c) == sa.end()) {
  15. sa.insert(c);
  16. cout << c;
  17. }
  18. }
  19. }
  20. return 0;
  21. }

解法2:双指针

时间复杂度O(n),空间复杂度O(n)

  1. #include <iostream>
  2. using namespace std;
  3. string a, b;
  4. bool st[256];
  5. int main() {
  6. cin >> a >> b;
  7. b += '#';
  8. for (int i = 0, j = 0; i < a.size(); i++) {
  9. char x = toupper(a[i]), y = toupper(b[j]);
  10. if (x == y) j++;
  11. else if (!st[x]) {
  12. cout << x;
  13. st[x] = true;
  14. }
  15. }
  16. return 0;
  17. }