Первый совет - не передавайте аргументы std: string по значению. Используйте константные ссылки
string swtch(const string& topermute, int x, int y)
void permute(const string & topermute, int place)
Это сэкономит вам массу ненужного копирования.
Что касается решения C ++, у вас есть функции std::next_permutation
и std::prev_permutation
в заголовке algorithm
. Так что вы можете написать:
int main(int argc, char* argv[])
{
if(argc!=2)
{
cout<<"Proper input is 'permute string'" << endl;
return 1;
}
std::string copy = argv[1];
// program argument and lexically greater permutations
do
{
std::cout << copy << endl;
}
while (std::next_permutation(copy.begin(), copy.end());
// lexically smaller permutations of argument
std::string copy = argv[1];
while (std::prev_permutation(copy.begin(), copy.end())
{
std::cout << copy << endl;
}
return 0;
}
Что касается решения C, вы должны изменить типы переменных с std :: string на char * (тьфу, и вы должны правильно управлять памятью). Я думаю, что аналогичный подход - написание функций
int next_permutation(char * begin, char * end);
int prev_permutation(char * begin, char * end);
с той же семантикой, что и функции STL - подойдет. Вы можете найти исходный код для std::next_permutation
с объяснением здесь . Я надеюсь, что вам удастся написать подобный код, который работает на char * (BTW std :: next_permutation может работать с char * без проблем, но вы хотели C-решение), так как мне лень делать это самостоятельно: -)