String umkehren
Dieser Tipp zeigt Möglichkeiten auf, mit denen ein String umgekehrt werden kann.
Iterative Variante
Die iterative Variante benutzt eine einfache Schleife, in der der String umgekehrt wird.Dabei wird jedes einzelne Zeichen in umgekehrter Reihenfolge in die Rückgabe-Variable kopiert:
function ReverseString(const AValue: string): string; var Len: Integer; Src: Integer; begin Len := Length(AValue); SetLength(Result, Len); for Src := 1 to Len do Result[Src] := AValue[Len - Src + 1]; end;
Rekursive Variante
Die rekursive Variante löst dieses große Problem, indem sie es in immer kleiner werdende Probleme unterteilt, bis sie direkt lösbar sind – dies erreicht sie, indem sie sich selbst aufruft.Das große Problem besteht darin, alle Zeichen umzukehren: Als Ganzes ist dies nicht möglich, aber sobald das große Problem in kleinere zerlegt wird, ist es einfach, sie zu lösen.Es wird also versucht, das Problem insoweit zu reduzieren, dass es nur noch zwei Teile bzw. Elemente gibt, welche direkt vertauscht werden können.Folgende Funktion arbeitet nach dem rekursivem Prinzip:
function ReverseString(const AValue: string): string; var APart1, APart2: string; begin if Length(AValue) > 1 then begin APart1 := AValue[1]; //Der erste Teil APart2 := ReverseString(Copy(AValue, 2, Length(AValue) - 1)); //Der zweite Teil Result := APart2 + APart1; //Vertauschung und Zusammführung der beiden Teile end; end;
Ab Delphi 6 steht bereits eine gleichnamige Funktion zur Verfügung.
Auf ein Palindrom prüfen
Wenn ein String umgedreht wurde, kann sehr leicht geprüft werden, ob es sich dabei um ein Palindrom handelt. Ein Palindrom ist ein Wort, welches sowohl vorwärts als auch rückwärts gelesen identisch ist. Bekannte Beispiele sind ‚anna‘ oder ‚otto‘.Es muss also nur das Wort umgedreht und geprüft werden, ob es mit dem Ausgangswort übereinstimmt.Folgende Funktion testet nach dem beschriebenem Verfahren, ob es sich um ein Palindrom handelt:
function IsPalindrom(const AWord: string): Boolean; begin Result := (AWord = ReverseString(AWord)); //Ist das Wort mit dem umgedrehten identisch? end;