Составление процедуры С++
Есть задача, условие которой я просто не понимаю, вот как она звучит:
Я что-то попытался написать, но мне кажется что это вообще не так как нужно, не могли бы вы мне помочь?
#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 шт):
вообще-то не очень хорошо (вернее очень плохо) удалять элементы строки в цикле по этой строке - это почти всегда ошибки или еще какая нехорошая гадость
можно сделать следующее:
собрать новую строку добавляя к ней по одному символу, который отсутствует во второй строке
в вашем примере внутренний цикл нужен будет только для того, чтобы определить входит ли символ во вторую строку или нет
хотя и для этого не нужен цикл, а можно использовать метод 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;
}
