AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "Überlappungen" zwischen zwei Strings
Thema durchsuchen
Ansicht
Themen-Optionen

"Überlappungen" zwischen zwei Strings

Ein Thema von Der schöne Günther · begonnen am 15. Jun 2020 · letzter Beitrag vom 15. Jun 2020
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

"Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 08:24
Mein Covfefe ☕ scheint heute noch nicht zu wirken.

Angenommen ich habe zwei Strings Eins Zwo Hallo Welt und Hallo Welt Guten Tag . Ich möchte die zwei Strings konkatenieren, allerdings "ohne das doppelte mittendrin":

Code:
Eins Zwo Hallo Welt
         Hallo Welt Guten Tag

=>

Eins Zwo Hallo Welt Guten Tag
Gibt es da einen trivialen Lösungsansatz? Schwere Geschütze mit Queues/Stacks oder regulären Ausdrücken wollte ich vermeiden.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 08:54
Ohne das doppelte mitten drin oder allgemein doppelte Wörter?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
900 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:21
Auf Anhieb fällt mir nur das naive Vorgehen ein:
  • Suche das erste Zeichen des zweiten Strings im ersten Strings (also im Beispiel "H")
  • Überprüfe, ob ab dieser Stelle der Rest des ersten Strings mit dem Anfang des zweiten übereinstimmt
  • Falls nicht, suche das nächste Vorkommen des ersten Zeichens im zweiten Strings. (*)
  • Falls ja, hat man die Überlappung gefunden und kann die Strings zusammenbauen

(*) diese Stelle kann man ggf. beschleunigen, wenn man ähnliche Tricks anwendet wie bei Knuth-Morris-Pratt. Damit sollte man dann auf eine lineare Worst-Case-Laufzeit kommen, die so erstmal nicht garantiert ist.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:34
Wie wäre es, wenn man die Strings übereinander legt und prüft, ob die überlappenden Buchstaben/Teilstring gleich sind. Wenn ja, hat man die Überschneidung. Wenn nein, verschiebt man den 2. String um eine Stelle und prüft wieder. Da böte sich vielleicht eine rekursive Lösung an.

Code:
Eins Zwo Hallo Welt
Hallo Welt Guten Tag

Eins Zwo Hallo Welt
 Hallo Welt Guten Tag

Eins Zwo Hallo Welt
  Hallo Welt Guten Tag

...

Eins Zwo Hallo Welt
         Hallo Welt Guten Tag
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:39
Vorab eine blöde Frage:

Kann auch folgendes vorkommen:

1. Eins Zwo Hallo Welt
2. Drei Hallo Guten Tag
= keine Überlappung.

Oder:

1. Eins Zwo Hallo Welt Drei
2. Hallo Welt Guten Tag
= Eins Zwo Hallo Welt Guten Tag Drei

Oder ist es immer so, das der Beginn der möglichen Überlappung am Anfang des zweiten Strings definiert ist?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:42
Oder ist es immer so, dass der Beginn der möglichen Überlappung am Anfang des zweiten Strings definiert ist?
Ganz genau: Ende von 1 = Anfang 2
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.106 Beiträge
 
Delphi 2009 Professional
 
#7

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:49
Irgendwie so?
Delphi-Quellcode:
uses Math, StrUtils;

Length1 := Length(Text1); // man sollte LeftStr und RightStr unten ersetzen durch das wesentlich effizientere Copy, wofür man das hier braucht, dafür bin ich aber zu faul
for i := 1 to Min(Length(Text2), Length1) do
if RightStr(Text1, i) = LeftStr(Text2, i) then
Exit(Text1, Copy(Text2, i, High(Integer)));
raise Exception.Create('geht nicht');
Je nach Anforderung muss man die Schleife umdrehen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
900 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:55
Dann würde ich erstmal die Methode von mir (bzw. die von Nersgatt, das ist ja identisch) nehmen. Kann man natürlich in der Hinsicht optimieren, dass das erste "Übereinanderlegen" so anfängt, dass der untere String rechtsbündig mit dem ersten ist. Vorher ergibt die Suche ja keinen Sinn.

Und wenn eine gute (d.h. lineare) Worst-Case-Laufzeit wichtig ist (Probleme machen bei solchen Ansätzen Strings wie "abababababaC"), dann schau dir Knuth-Morris-Pratt an und modifiere den etwas. Das "Muster" wäre dann der zweite String, und die Modifikation muss so sein, dass das Muster auch als "gefunden" gilt, wenn es nach rechts über den "Text" (also der String in dem gesucht wird) herausragt.

"Bruteforce" wäre natürlich eine Schleife mit AnsiStartStr und AnsiEndStr (oder vergleichbaren Ansätzen, siehe Beitrag von Redeemer). Bei kurzen Strings ist das aber sicherlich vertretbar, d.h. wenn die Programmierkosten hier relevanter sind als eine gute Laufzeit.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz