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 immervoid 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); } } };