Alle Wort Kombination einer länge x generieren



  • Hallo Leute,

    ich möchte in meinem Programm gerne alle Wörter aus dem Alphabet (a-z,0-9,-) mit einer Länge x erzeugen. Wenn x = 2 ist, wäre die Ausgabe z.B.:

    aa
    ab
    ac
    ad
    ...

    Hätte jemand eine Idee wie ich sowas umsetzen könnte? Das x sollte als Variable immer zu ändern sein.

    Johannes



  • Dafür gibt's in der STL einen Algorithmus... irgendwas mit Permutation... ich glaube next_permutation oder so, siehe <algorithm>



  • ganzes alphabet? Zahlen?



  • gibbets2000 schrieb:

    ganzes alphabet? Zahlen?

    Sagte er doch bereits:

    ...alle Wörter aus dem Alphabet (a-z,0-9,-)...

    MfG SideWinder



  • hi, also auf die schnelle halt ne bruteforce variante. nur pseudocode, sollte aber klar werden wie es gemeint ist (kein gewähr....können sich schon kleine fehler eingeschlichen haben).

    array alleZeichen = ... //da muss halt alles rein, was permutiert werden soll
    //also a bis z oder was auch immer

    void func(x)
    {
    array a = func1(x);
    print(a);
    }

    array func1(x)
    {
    if(x==0)
    {
    return null;
    }
    else
    {
    array a = func1(x-1);
    if(a = null)
    {
    return alleZeichen;
    }
    else
    {
    array b;
    for (int i = 0; a.size() > i; i++)
    {
    for (int j = 0; alleZeichen.size() > j; j++)
    {
    b.add((String)a.get(i) + (String)alleZeichen.get(j));
    }
    }
    return b;
    }
    }
    }



  • #include<vector>
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    template < typename T >
    void printContainer (T& t)
    {
      typename T::iterator i;
      cout << "<Container> ";
      for (i = t.begin (); i != t.end (); i++)
        {
          cout << (*i) << " ";
        }
      cout << "</Container>" << endl;
    }
    
    template < typename T >
    void printPermutations (T& t)
    {
      int anz = 1;
      for (int i = 0; i < t.size (); i++)
        anz *= (i + 1);
      for (int i = 0; i < anz; i++)
        {
          printContainer (t);
          next_permutation (t.begin (), t.end ());
        }
    }
    
    int main (void)
    {
      string str="abcd";
      printPermutations (str);
      return 0;
    }
    

    Nur als Ansatz...
    (Ja, ich gebe es zu, der Code ist schlecht...)



  • Permutationen bringens hier nicht. Das sollte eigentlich schon am Beispiel klar geworden sein. Wie kann "aa" oder "ab" denn eine Permutation von "abc...xyz012..89_" sein?



  • Hmm, man könnte z.B. 2 Mengen A={a,b,..z,0,..9} B={a,b,..z,0,..9} nehmen.

    a aus A, a aus B: aa
    a aus A, b aus B: ab ba
    a aus A, c aus B: ac ca
    ...
    a aus A, 9 aus B: a9,9a
    ...
    ...
    b aus A, b aus B: bb
    b aus A, c aus B: bc cb
    usw.

    Hat dann zwar keine so schöne Reihenfolge mehr, müßte aber funktionieren...
    Über Effizienz läßt sich streiten!

    🤡



  • Lässt sich mit einem leicht abgeänderten int_to_string realisieren.

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    const std::size_t num_chars = 4;
    
    std::string encode(unsigned value, std::size_t min_length)
    {
        const char chars[num_chars] = { 'a', 'b', 'c', 'd' };
    
        std::string result;
        while (value)
        {
            result += chars[value % num_chars];
            value /= num_chars;
        }
        while (result.length() < min_length)
            result += chars[0];
        std::reverse(result.begin(), result.end());
    
        return result;
    }
    
    int main()
    {
        // Für zwei Stellen.
        for (unsigned i = 0; i < num_chars * num_chars; ++i)
            std::cout << encode(i, 2) << std::endl;
        std::cin.get();
    }
    


  • class Combinations {
      string alphabet;
      string array;
      int length;
    public:
      Combinations(string alphabet, int length): 
        alphabet(alphabet), length(length) { array.resize(length); }
    
      void work(int pos = 0) {
        if (pos == length)
          cout << array << '\n';
        else
          for (unsigned i = 0; i < alphabet.size(); ++i) {
            array[pos] = alphabet[i];
            work(pos + 1);
          }
      }
    };
    

Anmelden zum Antworten