Удалить повторяющиеся символы

Для чего-то, что я пробовал в C ++, я принял строку (скажем, «помидор красный») и избавился от пробелов («atomatoisred»).

Теперь, как бы мне удалить только повторяющиеся символы при условии, что первый экземпляр этого символа останется (так что наш пример становится «атомизированным»)?

Заранее спасибо!

1

Решение

Вы можете использовать стереть-удалить идиому в сочетании с набором отслеживания дубликатов символов:

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 указывает, была ли вставка.

7

Другие решения

Если вы хотите реализовать это самостоятельно (без stl) Есть несколько способов.

  1. Через сортировку. Это работает, если вы не заботитесь о порядке символов. Сначала отсортируйте строку, затем просмотрите ее, выполнив очень простую проверку каждого элемента:

    if( currentElement == elemebtBeforeIt )
    deleteCurrentElement
    
  2. Другим способом является создание массива, выделенного для уникальных символов (ну, может быть, не массив, но вы поймете идею). Просмотрите вашу строку и для каждого символа проверьте:

    foreach Element of the string:
    if( arrayOfUniqueElements contains currentElement )
    do nothing
    else
    put currentElement into the arrayOfUniquElements
    

    После этого у вас будут все уникальные элементы в выделенном массиве.

0

По вопросам рекламы [email protected]