Составление процедуры С++

Есть задача, условие которой я просто не понимаю, вот как она звучит:

введите сюда описание изображения

Я что-то попытался написать, но мне кажется что это вообще не так как нужно, не могли бы вы мне помочь?

#include <iostream>
using namespace std;

void line_delete(string& line1, string& line2)
{
    for (int i = 0; i < line1.length(); i++)
    {

        for (int j = 0; j < line2.length(); j++)
        {
            if (line1[i] == line2[j])
            {
                line1.erase(i, 1);
                j = 0;
                i -= 1;
            }
        }
    }
}
int main()
{
    string line1;
    string line2;
    cin >> line1;
    cin >> line2;

    cout << line1 << endl;
    line_delete(line1, line2);
    cout << line2 << endl;

}

Ответы (1 шт):

Автор решения: Zhihar

вообще-то не очень хорошо (вернее очень плохо) удалять элементы строки в цикле по этой строке - это почти всегда ошибки или еще какая нехорошая гадость

можно сделать следующее:

собрать новую строку добавляя к ней по одному символу, который отсутствует во второй строке

в вашем примере внутренний цикл нужен будет только для того, чтобы определить входит ли символ во вторую строку или нет

хотя и для этого не нужен цикл, а можно использовать метод find - символ или будет найден в строке 2 или не будет

далее - вообще конечно делать сложность задачи O(n^2) тоже нехорошо - это я про 2 цикла один в другом

во-первых оптимизировать можно как я написал выше - через метод find

во-вторых можно для начала перевести вторую строку в множество (std::set) и уже затем искать в нем символы - это хотя бы стоит O(log(n)) времени, итого общая сложность будет O(n*log(n))

вариант 1:

void line_delete(std::string& line1, const std::string& line2)
{
    std::string res = "";

    for (const char letter : line1)
    {
        if (line2.find(letter) == -1)
            res.push_back(letter);
    }

    line1 = res;
}

вариант 2:

void line_delete(std::string& line1, const std::string& line2)
{
    std::string res = "";

    std::set<char> dict;

    for (const char letter : line2)
    {
        dict.insert(letter);
    }

    for (const char letter : line1)
    {
        if (dict.find(letter) == dict.end())
            res.push_back(letter);
    }

    line1 = res;
}
→ Ссылка