Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
|
Re: 1,2,3,4,5,6 - Reihenfolgen
22. Jul 2003, 21:10
Hi
Hier mal meine Lösung
Delphi-Quellcode:
procedure Combi(const Value: String; List: TStrings);
procedure DoCombi(Pattern,Pos,Stop: PChar);
// Erzeuge alle Kombinationen ohne Duplikate (Permutationen) aus Pattern von der
// Zeichenposition Pos angefangen bis zur Zeichenposition Stop.
// Pattern muß alpha. sortiert sein.
// 'AABCDEEXYZ' ist korrekt, aber 'KABA..' ist falsch.
// Pattern enthält nach Rückkehr von DoCombi() wieder die ursprüngliche
// Sortierung, wird aber während der Rekursion modifiziert.
// Die Kombinationen werden alpha. aufsteigend enumeriert.
var
Cur: PChar;
Tmp,Last: Char;
begin
if Pos >= Stop then
begin
List.Add(Pattern);
Exit;
end;
Last := #0;
Cur := Pos;
while Cur <= Stop do
begin
Tmp := Cur^; Cur^ := Pos^; Pos^ := Tmp;
if Tmp > Last then
// verhindere Duplikate !
// Falls alle Kombinationen, inklusive Duplikate enumeriert werden sollen
// muß diese Abfrage entfernt werden. Die Restriktion der alpha. Sortierung
// ist dann auch nicht mehr erforderlich.
begin
DoCombi(Pattern, Pos +1, Stop);
Last := Tmp;
end;
Inc(Cur);
end;
Tmp := Pos^;
while Pos < Stop do
begin
Pos^ := Pos[1];
Inc(Pos);
end;
Pos^ := Tmp;
end;
var
Temp: String;
begin
Temp := Value;
UniqueString(Temp);
DoCombi(@Temp[1], @Temp[1], @Temp[Length(Temp)]);
end;
procedure Test;
var
List: TStringList;
begin
List := TStringList.Create;
try
Combi('123456', List);
WriteLn(List.Text);
finally
List.Free;
end;
end;
Sie ist ein bischen weniger aufwendig und arbeitet inplaced.
Oder hier Kombination und Permutation von Strings/Integern
Gruß Hagen
|
|
Zitat
|