Я пытаюсь реализовать алгоритм для генерации уникальных перестановок в лексикографическом порядке, описанном here. Ниже приводится моя реализация.Реализация лексикографического заказа для поиска уникальных перестановок
void My_Permute(string word) {
sort(word.begin(),word.end());
int size = word.size();
while (true) {
cout << word << endl;
int i = size - 2;
for (; i >= 0; --i) {
if (word[i] < word[i+1]) break;
}
if (i <= -1) break;
swap(word[i],word[i+1]);
cout << word << endl;
reverse(word.begin()+i+1,word.end());
}
}
Я уверен, что алгоритм верен, и что не так с моей реализацией? Моя функция пропускает некоторые перестановки. Ниже показан мой результат по сравнению с std :: next_permutation на входе abcd
.
My_Permute std::next_permutation
abcd abcd
abdc abdc
abdc acbd
adbc adbc
adcb adcb
dacb bacd
dbca bcad
dcba bcda
dcab bdac
dcba bdca
dcba cabd
cadb
cbad
...
Предложение стилистического улучшения: вместо 'if (i <= -1)', напишите 'if (i <0)'. –