Удалить повторяющиеся символы
Вопрос
Для небольшого эксперимента на C++ я принял строку (скажем, «помидор красный») и избавился от пробелов («atomatoisred»).
Теперь, как мне удалить только повторяющиеся символы при условии, что первый экземпляр этого символа останется (поэтому наш пример становится «атомисред»)?
Заранее спасибо!
Решение
Вы можете использовать идиома «стирать-удалить» в сочетании с набором, отслеживающим повторяющиеся символы:
std::set<char> dupes;
str.erase(
std::remove_if(
str.begin(), str.end(),
[&](char c) { return not dupes.insert(c).second; }),
str.end());
При этом также используется тот факт, что возвращаемое значение std::set::insert
— пара, второй элемент которой — bool
указывающее, состоялась ли вставка.
Другие советы
Если вы хотите реализовать это самостоятельно (без stl
), есть несколько способов.
Через сортировку.Это работает, если вас не волнует порядок символов.Сначала отсортируйте строку, а затем просмотрите ее, выполняя очень простую проверку каждого элемента:
if( currentElement == elemebtBeforeIt ) deleteCurrentElement
Другой способ — создать массив, посвященный уникальным символам (ну, может, и не массив, но вы поймете).Просмотрите свою строку и для каждого символа проверьте:
foreach Element of the string: if( arrayOfUniqueElements contains currentElement ) do nothing else put currentElement into the arrayOfUniquElements
После этого все уникальные элементы появятся в выделенном массиве.