2017-03-14 1 views
0

Je sais qu'il est possible d'utiliser n boucles imbriquées pour obtenir le résultat. Ce n'est cependant pas très flexible. Si je voulais obtenir chaque chaîne de n + 2 caractères, je devrais en écrire deux de plus pour les boucles. Je suis sûr que je devrais utiliser un paramètre appelé n_Letters et utiliser une sorte de récursivité. Des idées? C'est comme ça que mon code a l'air maintenant. Il donne toutes les combinaisons de 3 caractères.Comment obtenir toutes les chaînes possibles de n caractères en C++?

#include <iostream> 
#include <string> 
using namespace std; 

void StringMaker(){ 
    for(int firstLetter = 97; firstLetter < 123; firstLetter++){ 
    char a = firstLetter; 
    for(int secondLetter = 97; secondLetter < 123; secondLetter++){ 
     char b = secondLetter; 
     for(int thirdLetter = 97; thirdLetter < 123; thirdLetter++){ 
      char c = thirdLetter; 
      cout << a << b << c << endl; 
     } 
    } 
} 
} 

int main() { 
    StringMaker(); // I could add a parameter n_Letters here 
} 
+0

Il ne semble pas que vous renvoyiez 'string' de' StringMaker'. –

+0

C'est vrai. Je vais l'éditer pour annuler. – Robbebeest

+6

Vous devriez utiliser '' a'' et '' z'' à la place de '97' et' 123'. –

Répondre

1

Il s'agit d'un simple problème de traversée d'arbre qui peut facilement être résolu en utilisant la récursivité. À l'aide d'un compteur (count) et accumulateur (partial) se reproduisent sur votre fonction pour chaque lettre jusqu'à count est zéro puis imprimer partial. Edit: Il semble que leur réponse à certaines questions concernant les allocations de mémoire soit préoccupante. Si c'est une préoccupation pour vous, considérez cette solution alternative. Incrémentez le premier caractère si ce n'est pas 'z', sinon réglez-le sur a et répétez avec le deuxième caractère. Pour ce faire, jusqu'à ce que le dernier caractère soit défini entre z et a. Cela agit comme une sorte de compteur de base 26 avec count chiffres.

#include <iostream> 
#include <string> 

void StringMaker(size_t count) 
{ 
    std::string data(count, 'a'); 
    size_t i = 0; 
    do 
    { 
     std::cout << data << '\n'; 

     for (i = 0; i < count; ++i) 
     { 
      auto & next_char = data[i]; 
      if (next_char < 'z') { 
       ++next_char; 
       break; 
      } 
      else { 
       next_char = 'a'; 
      } 
     } 

    } while (i != count); 
} 

int main() { 
    StringMaker(3); 
    return 0; 
} 
+1

C'est un _lot_ d'allocations de mémoire ... –

+0

Merci beaucoup. J'ai commencé avec C++ hier et je n'avais jamais entendu parler d'un accumulateur auparavant. Je vais certainement y regarder de plus près. Je ne savais pas non plus que vous pouviez simplement utiliser 'a' au lieu de 97. Merci :) – Robbebeest

+0

La première solution a été testée sur une plate-forme avec optimisation de chaîne courte. Il ne sera probablement pas tenir pour des chaînes plus longues, ou sur des systèmes sans cette optimisation. Je voudrais l'enlever, mais je préfère ne pas modifier radicalement une réponse après qu'elle a été acceptée. –

1

Voici mon juste pour-fun solution:

void StringMaker(int n) 
{ 
     int base = ('z' - 'a' + 1); 
     std::string str(n, '\0'); 

     for(int i = 0; i < int_pow(base, n); ++i) 
     { 
      for(int j = 0; j < n; ++j) 
      { 
        str[n - j - 1] = 'a' + i/int_pow(base, j) % base; 
      } 
      cout << str << '\n'; 
     } 
} 

Supposons que nous avons i écrit dans le système numérique avec la base 26 (de a à z), alors incrémenter i avec n = 4 donner us aaaa, aaab et ainsi de suite