Achso. Dann muss meine obige Lösung dahingehend angepasst werden, das z.B. alle Ketten, die nur aus einem Element bestehen nachher gelöscht werden, sowie auch alle Ketten mit mehr als einem Element, die aber nur einmal vorkommen.
Alternativ kann man natürlich direkt j erst bei 1 anfangen lassen und erst wenn Vorkommenzahl(Kette)>1 ist die Kette in die Liste aufnehmen. Mach das mal:
Delphi-Quellcode:
var:
i, j, k, l, temp :Integer;
Tiefe : Integer;
Kette : String
Kettenliste:TStringlist;
Anzahlliste:TStringlist;
function InListe(const KT : String):Boolean;
begin
Result:=false;
For l = 0 To Kettenliste.Count-1 do
if Kettenliste[l]=Kette then Result:=true;
end
function Vorkommenszahl(const KT : String):Integer;
begin
//Die Funktion ist mir aus dem Kopf zu kompliziert:
//Kette in Elemente zerlegen, Anz. Elemente bestimmen
//Elemente in DynArray speichern
//Das "Hauptarray" Array durchgehen und in Schleifen mit den Elementen von DynArray vergleichen
//Wenn passende Kette gefunden wird einen Counter hochgezählt
end
begin
Tiefe:=5;
Kettenliste:=TStringlist.Create(nil);
Anzahlliste:=TStringlist.Create(nil);
For i:=0 To Array.Count-1 do
begin
For j:=1 To Tiefe-1 do
begin
Kette:='';
For k = 0 to j do
Kette:=Kette+IntToStr(Array[i+k])+';';
if not InListe(Kette) then
begin
temp:=Vorkommenzahl(Kette);
if temp>1 then
begin
Kettenliste.Add(Kette);
Anzahlliste.Add(IntToStr(temp))
end;
end;
end;
end;
end;