Das fand ich jetzt ne nette kleine Übung. Mein Ansatz:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure GenerateList(Target: TStrings; Source: String; IndexS: Integer; lMax: Integer; currentEntry: String); var i: Integer; newEntry: String; begin for i := IndexS to (Length(Source) - (lMax - Length(currentEntry)) + 1 ) do begin newEntry := currentEntry + Source[i]; if Length(newEntry) = lMax then Target.Add(newEntry) else GenerateList(Target, Source, i + 1, lMax, newEntry); end; end; |
Aufruf besser über eine temporäre Stingliste, nicht direkt Lines von einer Memo (dauert sonst
erheblich länger)), also z.B.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var s: String; sl: TStringList; begin Memo1.Lines.Clear; s := ''; sl := TStringList.Create; try GenerateList(sl, Edit1.Text, 1, Spinedit1.Value, s); Memo1.Lines.Assign(sl); finally sl.Free; end; end; |
Dauer bei 5 aus 26 (65780 Möglichkeiten): knapp 15 Sekunden. Kann man bestimmt noch ordentlich optimieren.
Ich weiß auf Anhieb nur nicht so recht, wie man die Anzahl der Möglichkeiten berechnen kann ...
Edit: Ok, bei 5 aus 26 sind das 26 * 25/2 * 24/3 * 23/4 * 22/5. Kann man sicherlich allgemein als Produkt schreiben, und hat bestimmt eine feste Bezeichnung in der Kombinatorik.
Edit2: Mit der Antwort von jfheins ist mir jetzt auch klar, wie diese Anzahl zustande kommt -
- alle möglichen und dann die Permutationen wegdividieren, alles klar.
We are, we were and will not be.