Den längsten Rand einer Zeichenkette finden

8

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?

    
Algorithmist 22.10.2010, 12:59
quelle

10 Antworten

16

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) .

    
DAle 06.06.2017 06:45
quelle
3

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.

    
Willie Wheeler 06.06.2017 06:32
quelle
2

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.

    
Web_Designer 06.06.2017 19:32
quelle
1

Um die längste Grenze zu erhalten, tun Sie dies:

%Vor%

Um die längste Grenze selbst zu erhalten,

%Vor%     
kalu 07.03.2017 03:31
quelle
1

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%     
Chiheb Nexus 06.06.2017 06:38
quelle
1

Diese einfache Lösung mit einer einzigen Schleife funktioniert gut:

%Vor%

Beispiel:

%Vor%

Ausgabe:

%Vor%

Siehe Ссылка

    
Rei 06.06.2017 07:25
quelle
1

Ich habe in letzter Zeit viel Javascript benutzt, also habe ich es mit Javascript gemacht:

%Vor% %Vor%
    
Jeanze 12.06.2017 20:29
quelle
0

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%     
Harini 13.06.2017 05:20
quelle
0
___ qstnhdr ___ Den längsten Rand einer Zeichenkette finden ___ answer44383077 ___

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% .

    
___ answer42639680 ___

Um die längste Grenze zu erhalten, tun Sie dies:

%Vor%

Um die längste Grenze selbst zu erhalten,

%Vor%     
___ answer44382855 ___

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.

    
___ answer44382951 ___

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%     
___ answer44383784 ___

Diese einfache Lösung mit einer einzigen Schleife funktioniert gut:

%Vor%

Beispiel:

%Vor%

Ausgabe:

%Vor%

Siehe Ссылка

    
___ answer44508204 ___

Ich habe in letzter Zeit viel Javascript benutzt, also habe ich es mit Javascript gemacht:

%Vor% %Vor%
    
___ answer44398399 ___

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.

    
___ answer44512910 ___

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%     
___ answer3997161 ___

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%     
___ answer44513130 ​​___

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%     
___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ qstntxt ___

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?

    
___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___
Harini 13.06.2017 05:40
quelle
-1

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%     
mike_b 22.10.2010 13:19
quelle

Tags und Links