Стратегия изменения алгоритма перестановки для предотвращения дублирования распечаток

Я просматривал алгоритмы для практики, и сейчас я смотрю на алгоритм перестановки, который мне очень нравится:

void permute(char* set, int begin, int end) {
    int range = end - begin;

    if (range == 1)
        cout << set << endl;
    else {
        for(int i = 0; i < range; ++i) {
            swap(&set[begin], &set[begin+i]);
            permute(set, begin+1, end);
            swap(&set[begin], &set[begin+i]);
        }
    }
}

На самом деле я хочу применить его в ситуации, когда будет много повторяющихся символов, поэтому мне нужно уметь модифицировать его, чтобы предотвратить печать дублирующихся перестановок.

Как я могу определить, что я генерирую дубликат? Я знаю, что могу хранить это в хэше или чем-то подобном, но это не оптимальное решение - я бы предпочел такое, которое не требует дополнительного хранения. Может кто-нибудь подсказать?

PS: Я не хочу использовать механизмы перестановки STL, и я не хочу, чтобы где-то была ссылка на еще один "уникальный алгоритм перестановки". Я хотел бы понять механизм, используемый для предотвращения дублирования, чтобы я мог встроить его в это в процессе обучения, если это возможно.

6
задан John Humphreys - w00te 29 February 2012 в 03:15
поделиться