Créer efficacement une liste de mots séquentielle à partir d’un jeu de caractères

J’ai besoin de trouver un moyen efficace de créer une liste de mots séquentiels créés à partir d’un jeu de caractères donné en C / C ++. Laisse moi te donner un exemple:

Si le jeu de caractères est “abc”, l’algorithme devrait générer:

a b c aa ab ac ba bb bc ca cb cc aaa aab ... 

J’ai quelques idées, mais toutes exigent trop de maths et j’ai vraiment besoin d’une solution rapide. Qui a une idée?

 #include  #include  char* numToColumn(int n, char* outstr, const char* baseset){ char* p = outstr; int len; len = strlen(baseset); while(n){ *p++ = baseset[0 + ((n % len == 0)? len : n % len) - 1]; n = (n - 1) / len; } *p = '\0'; return strrev(outstr);//strrev isn't ANSI C } char* incrWord(char* outstr, const char* baseset){ char *p; int size,len; int i,carry=1; size = strlen(baseset); len = strlen(outstr); for(i = len-1; carry && i>=0 ;--i){ int pos; pos = strchr(baseset, outstr[i]) - baseset;//MUST NOT NULL pos += 1;//increment if(pos == size){ carry=1; pos = 0; } else { carry=0; } outstr[i]=baseset[pos]; } if(carry){ memmove(&outstr[1], &outstr[0], len+1); outstr[0]=baseset[0]; } return outstr; } int main(){ const char *cset = "abc"; char buff[16]; int i; for(i=1;i<16;++i)//1 origin printf("%s\n", numToColumn(i, buff, cset)); strcpy(buff, "cc");//start "cc" printf("\nrestart\n%s\n", buff); printf("%s\n", incrWord(buff, cset)); printf("%s\n", incrWord(buff, cset)); return 0; } /* RESULT: a b c aa ab ac ba bb bc ca cb cc aaa aab aac restart cc aaa aab */ 

C’est vraiment une légère modification de cette réponse:

Quel est l’algorithme optimal pour faire toutes les combinaisons possibles d’une chaîne?

Avec la réponse ci-dessus, vous pouvez placer un wrapper autour de la routine qui effectue essentiellement des permutations de la chaîne d’entrée principale, laissant ainsi au perutation finder toutes les permutations de vos chaînes d’entrée pré-permutées.

Le code Java suivant fonctionne bien.

 class Combination { static Ssortingng word; static int length; static int[] num; public static void main(Ssortingng args[]) { word = "abc"; length = word.length(); num = new int[length + 1]; for(int i=1; i<=length-1; i++) num[i] = 0; num[length] = 1; while(num[0] == 0) { display(); System.out.println(); increment(length); } } public static void increment(int digit) { if(num[digit] + 1 <= length) num[digit]++; else { num[digit] = 1; increment(digit-1); } } public static void display() { for(int i=1; i<=length; i++) { if(num[i] == 0) System.out.print(' '); else System.out.print(word.charAt(num[i]-1)); } } } 

Je ne suis pas sûr de sa complexité. Mais je ne pense pas que ce soit très complexe.