Я успешно разработал алгоритм для печати всех перестановок с повторением чисел. Но алгоритм, который я разработал, имеет недостаток. Он работает только в том случае, если символы строки уникальны.Алгоритм для печати всех перестановок с повторением чисел
Может кто-то помочь мне в расширении алгоритма для случая, когда символы из строки не могут быть уникальными .. Моим код до сих пор:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<iostream>
using namespace std;
void _perm(char *arr, char*result, int index)
{
static int count = 1;
if (index == strlen(arr))
{
cout << count++ << ". " << result << endl;
return;
}
for (int i = 0; i < strlen(arr); i++)
{
result[index] = arr[i];
_perm(arr, result, index + 1);
}
}
int compare(const void *a, const void *b)
{
return (*(char*)a - *(char*)b);
}
void perm(char *arr)
{
int n = strlen(arr);
if (n == 0)
return;
qsort(arr, n, sizeof(char), compare);
char *data = new char[n];
_perm(arr, data, 0);
free(data);
return;
}
int main()
{
char arr[] = "BACD";
perm(arr);
return 0;
}
Я печать выходных строк в лексикографическом отсортированном пути ,
Я имею в виду пример.3 с этой страницы.
http://www.vitutor.com/statistics/combinatorics/permutations_repetition.html
Спасибо.
hi @ stark92 ... проверьте следующий подход ..http: //www.geeksforgeeks.org/write-ac-program-to-print-all-permutations-of-a-given-string/ – Karunakar
@ Karunakarn Исправьте меня, если я ошибаюсь. Даже этот код работает только в том случае, если строка содержит уникальные символы. Он будет печатать дубликаты, если строка не содержит уникальных символов. – starkk92
Ваш код не печатает перестановки (из которых должно быть 4! == 24 для «ABCD»), но результат четырех ничьих из пула «ABCD», где каждая буква может использоваться несколько раз. –