题目


解法1:用数组

点击查看代码
#include<iostream>
#include<string>
using namespace std;

int main() {
    string s1, s2;
    getline(cin, s1); // 原始字符串(应该输入的)
    getline(cin, s2); // 实际输入的字符串

    // 标记哪些键是好的(已经出现过的),全部转成大写
    bool good[256] = {false};
    for (char c : s2) {
        // 如果是小写字母,转成大写
        if (c >= 'a' && c <= 'z') {
            c = c - 'a' + 'A';
        }
        good[(int)c] = true;
    }

    // 记录是否已经输出过该坏键
    bool bad[256] = {false};
    for (char c : s1) {
        char upperC = c;
        // 转成大写
        if (c >= 'a' && c <= 'z') {
            upperC = c - 'a' + 'A';
        }
        // 如果它不是好的,并且是从没出现过的
        if (!good[(int)upperC] && !bad[(int)upperC]) {
            cout << upperC;
            bad[(int)upperC] = true;
        }
    }

    return 0;
}

解法2:用unordered_set

点击查看代码
#include <iostream>
#include <unordered_set>
using namespace std;

int main() {
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);

    unordered_set<char> good;
    for (char c : s2) {
        if (c >= 'a' && c <= 'z') c = c - 'a' + 'A';
        good.insert(c);
    }

    unordered_set<char> bad;
    for (char c : s1) {
        if (c >= 'a' && c <= 'z') c = c - 'a' + 'A';
        if (good.find(c) == good.end() && bad.find(c) == bad.end()) {
            cout << c;
            bad.insert(c);
        }
    }

    return 0;
}