Мне нужно сгенерировать всю перестановку строки с выбором некоторых элементов.Например, если в моей строке "abc", вывод будет {a, b, c, ab, ba, ac, ca, bc, cb, abc, acb, bac, bca, cab, cba}.
IЯ подумал об основном алгоритме, в котором я генерирую все возможные комбинации «abc», которые являются {a, b, c, ab, ac, bc, abc}, а затем переставляем их все.
Так есть ли эффективный алгоритм перестановки, с помощью которого я могу генерировать все возможные перестановки с переменным размером.
Код, который я написал для этого:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <map>
using namespace std;
int permuteCount = 1;
int compare (const void * a, const void * b)
{
return ( *(char*)a - *(char*)b);
}
void permute(char *str, int start, int end)
{
// cout<<"before sort : "<<str;
// cout<<"after sort : "<<str;
do
{
cout<<permuteCount<<")"<<str<<endl;
permuteCount++;
}while( next_permutation(str+start,str+end) );
}
void generateAllCombinations( char* str)
{
int n, k, i, j, c;
n = strlen(str);
map<string,int> combinationMap;
for( k =1; k<=n; k++)
{
char tempStr[20];
int index =0;
for (i=0; i<(1<<n); i++) {
index =0;
for (j=0,c=0; j<32; j++) if (i & (1<<j)) c++;
if (c == k) {
for (j=0;j<32; j++)
if (i & (1<<j))
tempStr[ index++] = str[j];
tempStr[index] = '\0';
qsort (tempStr, index, sizeof(char), compare);
if( combinationMap.find(tempStr) == combinationMap.end() )
{
// cout<<"comb : "<<tempStr<<endl;
//cout<<"unique comb : \n";
combinationMap[tempStr] = 1;
permute(tempStr,0,k);
} /*
else
{
cout<<"duplicated comb : "<<tempStr<<endl;
}*/
}
}
}
}
int main () {
char str[20];
cin>>str;
generateAllCombinations(str);
cin>>str;
}
Мне нужноиспользовать хеш для избежания одной и той же комбинации, поэтому, пожалуйста, дайте мне знать, как я могу улучшить этот алгоритм.
Спасибо, GG