Zunächst möchte ich Ihnen sagen, was der Rahmen einer Zeichenkette ist,
%Vor% Der Rand eines Strings ist ein Teilstring, der sowohl ein richtiges Präfix als auch ein richtiges Suffix des Strings ist - "richtig" bedeutet, dass der ganze String nicht als Teilstring zählt. Die längste Grenze von x
ist "ab". Der längste Rand von y
ist "abab" (Präfix und Suffix können sich überlappen).
Ein anderes Beispiel:
In der Zeichenfolge " abcde hgrab abcde " ist "abcde" sowohl ein Präfix als auch ein Suffix. Somit ist es auch der längste Rand der obigen Zeichenfolge.
Wie finde ich den längsten Rand einer Zeichenkette?
Den "Rand einer Zeichenkette" zu finden ist die Präfixfunktion (auch als Fehlerfunktion bekannt) des Knuth-Morris-Pratt-Algorithmus tun. Implementierung in C ++ (eine geänderte Version von dieser Code ):
%Vor%Lauffähige Version: Ссылка
Die Komplexität dieses Algorithmus ist O(n)
.
Hier ist eine Java-Implementierung, basierend auf der Annahme, dass Grenzen richtige Teilstrings sind. (Ansonsten ist die längste Grenze einfach die Stringlänge.)
%Vor%Dies könnte ein wenig optimiert werden, indem man mit dem Zeichenarray der Zeichenfolge beginnt und dann einzelne Zeichen vergleicht, aber die Idee hinter dem Algorithmus ist klarer, wie ich es geschrieben habe.
Hier ist eine JS-Lösung mit Kommentar, die die Präfixfunktion DAIe erwähnt verwendet:
%Vor%Er gibt die längsten Begrenzungslängen jedes Präfixes in einer Zeichenkette zurück (was viel mehr ist als gefordert, aber in linearer Zeit). Um also die Länge des längsten Rahmens in der vollständigen Zeichenfolge zu erhalten:
%Vor%Eine weitere großartige Ressource, um zu verstehen, wie das funktioniert, ist dieses Video (und das davor) auf Coursera.
Ich habe eine Lösung mit Python3
erstellt (funktioniert auch mit Python2
), mit Counter
von collections
module und max()
.
Hier ist meine Lösung:
%Vor%Ausgabe:
%Vor%Hier ist der Code Implementierung in c, um den längsten Rand der Zeichenkette zu finden
%Vor%FUNCTION: isasubstring, das die maximale Breite und das Muster des Rahmens aus der Zeichenfolge findet.
%Vor%}
Die Ausgabe des Programms wie folgt: // Wenn die Eingabe abcdefabcanabcabccabcdef ist
%Vor%Den "Rand einer Zeichenkette" zu finden ist die Präfixfunktion (auch als Fehlerfunktion bekannt) des Knuth-Morris-Pratt-Algorithmus tun. Implementierung in C ++ (eine geänderte Version von dieser Code ):
%Vor%Lauffähige Version: Ссылка
Die Komplexität dieses Algorithmus ist %code% .
Um die längste Grenze zu erhalten, tun Sie dies:
%Vor%Um die längste Grenze selbst zu erhalten,
%Vor%Hier ist eine Java-Implementierung, basierend auf der Annahme, dass Grenzen richtige Teilstrings sind. (Ansonsten ist die längste Grenze einfach die Stringlänge.)
%Vor%Dies könnte ein wenig optimiert werden, indem man mit dem Zeichenarray der Zeichenfolge beginnt und dann einzelne Zeichen vergleicht, aber die Idee hinter dem Algorithmus ist klarer, wie ich es geschrieben habe.
Ich habe eine Lösung mit %code% erstellt (funktioniert auch mit %code% ), mit %code% von %code% module und %code% .
Hier ist meine Lösung:
%Vor%Ausgabe:
%Vor%Diese einfache Lösung mit einer einzigen Schleife funktioniert gut:
%Vor%Beispiel:
%Vor%Ausgabe:
%Vor%Siehe Ссылка
Ich habe in letzter Zeit viel Javascript benutzt, also habe ich es mit Javascript gemacht:
Hier ist eine JS-Lösung mit Kommentar, die die Präfixfunktion DAIe erwähnt verwendet:
%Vor%Er gibt die längsten Begrenzungslängen jedes Präfixes in einer Zeichenkette zurück (was viel mehr ist als gefordert, aber in linearer Zeit). Um also die Länge des längsten Rahmens in der vollständigen Zeichenfolge zu erhalten:
%Vor%Eine weitere großartige Ressource, um zu verstehen, wie das funktioniert, ist dieses Video (und das davor) auf Coursera.
Hier ist der Code Implementierung in c, um den längsten Rand der Zeichenkette zu finden
%Vor%FUNCTION: isasubstring, das die maximale Breite und das Muster des Rahmens aus der Zeichenfolge findet.
%Vor%}
Die Ausgabe des Programms wie folgt: // Wenn die Eingabe abcdefabcanabcabccabcdef ist
%Vor%Wenn Sie über Zeichenarrays sprechen, denke ich, dass Sie Folgendes wollen. Dies basiert darauf, dass der Rahmen das erste und letzte Zeichen einer Zeichenfolge ist. Ihre Beispiele sind nicht klar, was eine Grenze ist. Sie müssen klarer definieren, was eine Grenze ist.
%Vor%und wenn Sie Länge benötigen
%Vor%Implementierung in Perl, Verwendung der Übereinstimmung regulärer Ausdrücke
%Vor%Dieses Programm erhält die Standardeingabe als String und sucht nach dem Muster.
%Vor%Zunächst möchte ich Ihnen sagen, was der Rahmen einer Zeichenkette ist,
%Vor%Der Rand eines Strings ist ein Teilstring, der sowohl ein richtiges Präfix als auch ein richtiges Suffix des Strings ist - "richtig" bedeutet, dass der ganze String nicht als Teilstring zählt. Die längste Grenze von %code% ist "ab". Der längste Rand von %code% ist "abab" (Präfix und Suffix können sich überlappen).
Ein anderes Beispiel:
In der Zeichenfolge " abcde hgrab abcde " ist "abcde" sowohl ein Präfix als auch ein Suffix. Somit ist es auch der längste Rand der obigen Zeichenfolge.
Wie finde ich den längsten Rand einer Zeichenkette?
Wenn Sie über Zeichenarrays sprechen, denke ich, dass Sie Folgendes wollen. Dies basiert darauf, dass der Rahmen das erste und letzte Zeichen einer Zeichenfolge ist. Ihre Beispiele sind nicht klar, was eine Grenze ist. Sie müssen klarer definieren, was eine Grenze ist.
%Vor%und wenn Sie Länge benötigen
%Vor%