Я просматривал алгоритмы для практики, и сейчас я смотрю на алгоритм перестановки, который мне очень нравится:
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, и я не хочу, чтобы где-то была ссылка на еще один "уникальный алгоритм перестановки". Я хотел бы понять механизм, используемый для предотвращения дублирования, чтобы я мог встроить его в это в процессе обучения, если это возможно.