Наивная реализация для печати всех комбинаций символов из заданной строки:
void print_combination(char* str, char* buffer, int len, int num, int pos)
{
if(num == 0)
{
std::cout << buffer << std::endl;
return;
}
for(int i = pos; i < len - num + 1; ++i)
{
buffer[num - 1] = str[i];
print_combination(str, buffer, len, num - 1, i + 1);
}
}
int main()
{
char str[] = "abcde";
char buffer[6];
for(auto i = 1u; i <= sizeof(str); ++i)
{
buffer[i] = '\0';
print_combination(str, buffer, 5, i, 0);
}
}
Довольно просто, но может иметь проблемы с производительностью. Возьми, если это поможет.
Если вы ищете перестановку (я не могу сказать из вашего описания), я реализовал алгоритм в «Искусстве компьютерного программирования»:
template <typename Iter>
bool next_permutation(Iter start, Iter end)
{
if(start == end)
return false;
Iter i = start + 1;
if(i == end)
return false;
i = end - 1;
while(true)
{
Iter ii = i;
--i;
if(*i < *ii)
{
Iter j = end;
while(*i >= *--j);
std::iter_swap(i, j);
std::reverse(ii, end);
return true;
}
if(i == start)
{
std::reverse(start, end);
return false;
}
}
}
int main()
{
char str1[] = "abcde";
do
{
std::cout << str1 << std::endl;
} while(next_permutation(&str1[0], &str1[5]));
}
Это довольно эффективно, и алгоритм C ++ stl использует тот же алгоритм.