Diese Frage unterscheidet sich etwas von der Art der längsten Sequenz oder Teilstring aus zwei Strings zu finden.Gegeben zwei Strings, finden Sie die längste gemeinsame Tasche von Zeichen
Bei zwei Strings der gleichen Größe N, finden Sie die längsten Teilstrings aus jeder Zeichenkette, so dass die Teilstrings die gleiche Tüte Zeichen enthalten.
Die beiden Teilstrings müssen nicht unbedingt dieselbe Sequenz haben. Aber sie müssen die gleiche Tüte Chars haben.
Zum Beispiel
a = ABCDDEGF b = FPCDBDAX
die längste passende Tasche der Zeichen sind ABCDD (ABCDD aus einem, aus CDBDA b)
Wie dieses Problem zu lösen?
UPDATE
Das Ziel ist Substrings von jeder Eingabekette zu finden, so dass sie die gleiche Tasche von Zeichen haben. Wenn sie "Teilzeichenfolge" sagen, müssen sie aufeinanderfolgende Zeichen sein.
aktualisieren: Anfangs dachte ich, einen dynamischen Programmieransatz. Es funktioniert wie folgt.
Um zwei Beutel mit Zeichen der gleichen Länge K zu vergleichen, würde es O (K) Zeit benötigen, um dies zu erreichen. Konvertieren jede Zeichenfolge in eine Verkürzen Form:
ABCDDEGF -> A1B1C1D2E1G1F1
FPCDBDAX -> A1B1C1D2F1P1X1
Das Verkürzen Form sortiert Alphabete nach der Anzahl der Frequenzen in der Zeichenfolge folgt. Das Konstruieren, Sortieren und Vergleichen der verkürzten Formen würde O (K) -Zeit insgesamt benötigen. (Die Implementierung kann jedoch unter Verwendung eines Arrays von Zeichen erreicht werden.)
Zwei Beutel mit Zeichen sind gleich, wenn ihre verkürzten Formen die gleichen Zeichen und die entsprechenden Häufigkeiten haben.
Zusätzlich braucht es O (logK) Zeit, um die Differenzzeichen zwischen den beiden Strings zu finden.
nun für zwei Eingänge Strings:
- Wenn ihre shorten Formen identisch sind, dann ist dies die längste gemeinsame Tasche von Zeichen.
- Suchen Sie Zeichen in String1 so, dass sie nicht in String2 erscheinen. Tokenize string1 in mehrere Teilstrings basierend auf diesen Zeichen.
- Suchen Sie Zeichen in String2, sodass sie nicht in Zeichenfolge1 angezeigt werden. Tokenize string2 in mehrere Teilstrings basierend auf diesen Zeichen.
- Jetzt haben wir zwei Liste von Zeichenfolgen. Vergleichen Sie jedes Paar (was wiederum das gleiche Problem mit einer kleineren Eingabegröße ist) und finden Sie den längsten gemeinsamen Beutel mit Zeichen.
Der schlimmste Fall wäre O (N) sein, und am besten Fall würde O (N) sein. Irgendeine bessere Idee?
Es sieht aus So wie du Count Sort für das "shorten form" verwendest - du kannst es nur benutzen, wenn du die Reichweite deiner Charaktere kennst. Als nächstes verwenden Sie nicht wirklich die Anzahl, nur um zu überprüfen, welche Zeichen vorhanden sind. Wie für Punkt 4 - es ist keine kleinere Problemeingabe. Mit 'abbbbbb' und' aaaaaaaaab' können Sie keinen Buchstaben löschen. Außerdem gibt Ihnen die Anzahl der Zeichen sehr wenig Informationen, besonders wenn Sie K von Anfang an nicht kennen. – Kobi
@Kobi: Zeichen sind ganze Zahlen. Zum Beispiel würde ASCII im Bereich von 0 bis 128 liegen. Es wird schwieriger sein, Unicode-Zeichen zuzulassen. Wir brauchen die Häufigkeitszählung, um "Gleichheit" der beiden verkürzten Formen zu testen. –
Also, überprüfen Sie für jede Unterzeichenfolge in allen Längen? – Kobi