I need to generate all permutation of a string with selecting some of the elements. Like if my string is "abc" output would be { a,b,c,ab,ba,ac,ca,bc,cb,abc,acb,bac,bca,cab,cba }.
I thought a basic algorithm in which I generate all possible combination of "abc" which are {a,b,c,ab,ac,bc,abc} and then permute all of them.
So is there any efficient permutation algorithm by which I can generate all possible permutation with varying size.
The code I wrote for this is :
#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; } I need to use a hash for avoiding same combination, so please let me know how can I make this algorithm better.
Thanks, GG
Nyou'll have2^N-1distinct non-empty subsets in the worst case (if all characters are different) and for each subset consisting ofLcharacters, you'll haveL!permutations.