Методы удаления повторяющихся символов из строки в C++

Чтобы удалить дубликаты из строки в C++, можно использовать несколько методов. Вот некоторые из распространенных подходов:

  1. Использование дополнительной структуры данных (набора):
    • Преобразуйте строку в заданную структуру данных, которая автоматически удаляет дубликаты.
    • Перебрать набор и создать новую строку без дубликатов.
#include <iostream>
#include <unordered_set>
using namespace std;
string removeDuplicates(string str) {
    unordered_set<char> uniqueChars;
    string result;

    for (char ch : str) {
        if (uniqueChars.find(ch) == uniqueChars.end()) {
            uniqueChars.insert(ch);
            result += ch;
        }
    }

    return result;
}
int main() {
    string input = "abbcdeeff";
    string output = removeDuplicates(input);

    cout << "Original string: " << input << endl;
    cout << "String without duplicates: " << output << endl;

    return 0;
}
  1. Сортировка и удаление соседних дубликатов:
    • Сортировка символов в строке.
    • Перебрать отсортированную строку и удалить соседние дубликаты.
#include <iostream>
#include <algorithm>
using namespace std;
string removeDuplicates(string str) {
    sort(str.begin(), str.end());
    str.erase(unique(str.begin(), str.end()), str.end());
    return str;
}
int main() {
    string input = "abbcdeeff";
    string output = removeDuplicates(input);

    cout << "Original string: " << input << endl;
    cout << "String without duplicates: " << output << endl;

    return 0;
}
  1. Использование массива в качестве таблицы поиска:
    • Инициализировать массив размером 256 (при условии, что символы ASCII) со всеми значениями, установленными на ноль.
    • Перебрать каждый символ в строке и пометить соответствующий элемент массива как 1.
    • Создайте новую строку, включив только те символы, для которых элемент массива помечен как 1.
#include <iostream>
#include <cstring>
using namespace std;
string removeDuplicates(string str) {
    bool lookup[256] = {false};
    string result;

    for (char ch : str) {
        if (!lookup[ch]) {
            lookup[ch] = true;
            result += ch;
        }
    }

    return result;
}
int main() {
    string input = "abbcdeeff";
    string output = removeDuplicates(input);

    cout << "Original string: " << input << endl;
    cout << "String without duplicates: " << output << endl;

    return 0;
}