Entwickler-Ecke

Sonstiges (Delphi) - Mathematisches Problem mit Strings :-)


Der Michel - Mo 24.03.03 15:02
Titel: Mathematisches Problem mit Strings :-)
Hallo,

ich weiß, die Überschrift mag ein wenig verwirrend sein, aber es geht um folgendes:
Angenommen ich habe den String 'ABCD', und ich möchte nun herausfinden welche Strings ich bekomme wenn ich jedes 'B' durch ein 'C' ersetze und umgekehrt.
In diesem Fall sollte also rauskommen:
ABBD, ABCD, ACBD und ACCD.

Hat jemand zufällig einen Algorithmus für so etwas parat, oder weiß jemand wo so etwas beschrieben steht?

Gruß,
Michel


Aya - Mo 24.03.03 19:42

Hi,

so sollte es gehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
function Replace(S, Old, New: String): TStringList;
var
  i: Integer;
  T: String;
begin
  Result:=TStringList.Create;

  T:=StringReplace(S,New,'(Old)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(Old)',Old,[rfReplaceAll,rfIgnoreCase]);
  Result.Add(T);

  T:=StringReplace(S,Old,'(New)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,New,'(Old)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(New)',New,[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(Old)',Old,[rfReplaceAll,rfIgnoreCase]);
  Result.Add(T);

  T:=StringReplace(T,Old,'(New)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,New,'(Old)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(New)',New,[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(Old)',Old,[rfReplaceAll,rfIgnoreCase]);
  Result.Add(T);

  T:=StringReplace(S,Old,'(New)',[rfReplaceAll,rfIgnoreCase]);
  T:=StringReplace(T,'(New)',New,[rfReplaceAll,rfIgnoreCase]);
  Result.Add(T);
end;


Aufrufen tust du das ganze dann so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TStringList;
begin
  t:=TStringList.Create;
  t:=Replace('ABCD','B','C');
  Memo1.Lines.Assign(t);
  t.Free;
end;


Au'revoir,
Aya~


Keldorn - Mo 24.03.03 20:07

Hallo Aya, was der code jetzt genau macht, hav ich mir nicht angeguggt.
Aber mit deinem Code schaffst du dir aber ein Speicherloch, da du 2xstringlist.create hast, diese aber nur 1xfreigibst. Besser wäre vielleicht, die Stringlist als Var-Parameter zu übergeben.
Mfg Frank


Der Michel - Di 25.03.03 10:55

Hallo,

mit dem String 'ABCD' funktioniert es wunderbar. :-)
Mit längeren oder kürzeren Strings ('ABD' oder 'ABBCD') aber leider nicht, es werden ja immer 4 Sachen ausgegeben. Aber erstmal danke für den Ansatz.

Gruß,

Michel