Во-первых, мы можем наблюдать, что когда происходит стирание, у нас всегда будет i<j
.
Задача 1
Теперь, если вы удалите первый символ, а затем второй, вы 'стрельба по движущейся цели: вам нужно настроить новое положение второго символа после удаления первого:
str2.erase(str2.begin() + i);
str2.erase(str2.begin() + j-1); // because former j c[j] is now c[j-1]
Другой вариант, который также подходит, - сначала удалить второй символ (нене изменяйте положение первого):
str2.erase(str2.begin() + j); // because j> i it has no impact on i
str2.erase(str2.begin() + i);
Оптимизация 1
Не связано, но мы также можем использовать наш вычет на i<j
для оптимизации или зацикливания и сохранения значительногоколичество бесполезных сравнений:
for(int i=0;i<str2.size();i++) {
for(int j=i+1;j<str2.size();j++) {
...
}
}
Оптимизация 2
Другая проблема заключается в том, что вы выполняете i--
во внутреннем цикле, когда i
не увеличивается.Это будет иметь два последствия, вы будете повторять сравнения, которые вы уже делаете.Так что просто удалите этот декремент и перезапустите с j=i+1
.
Онлайн демо .
Задача 2 (оставлено в качестве упражнения)
Ваш алгоритм удаляет только пары букв.Таким образом, если у вас есть более двух вхождений буквы, только два первых будут удалены.Поэтому вам нужно пересмотреть свой алгоритм (обратите внимание, чтобы не стереть несколько раз при первом появлении ;-))