String - Reduktion- Programming Contest . Lösung benötigt
Ich habe eine Frage, die uns auffordert, zu reduzieren die Zeichenfolge wie folgt.
Input ist eine Zeichenkette mit nur
A
,B
oderC
. Ausgabe muss die Länge des
die reduzierte stringDen string kann reduziert werden, indem die folgenden Regeln
Wenn überhaupt 2 verschiedene Buchstaben benachbart sind, diese zwei Buchstaben sein
ersetzt durch den Dritten Buchstaben.ZB
ABA
->CA
->B
. Also endgültige Antwort 1 (Länge reduziert, string)ZB
ABCCCCCCC
Diese nicht zu
CCCCCCCC
, wie es reduziert werden kann, alternativ durch die
ABCCCCCCC
->AACCCCCC
->ABCCCCC
->AACCCC
->ABCCC
->AACC
->ABC
->AA
als hier Länge ist 2 < (Länge
CCCCCCCC
)
Wie gehen Sie über dieses problem?
Vielen Dank!
Dinge klarzustellen: die Frage heißt es, es will die minimale Länge des reduzierten string. So im zweiten Beispiel oben gibt es 2 Lösungen möglich, eine CCCCCCCC
und die anderen AA
. So 2 ist die Antwort wie Länge AA
2, die kleiner ist als die Länge der CCCCCCCC
= 8.
- Wie funktioniert
ABCCCCCCC
gewordenAACCCCCC
? Die Regel würde vorschlagen, dass dieAB
wirdC
. - Charlesworth: ich denke, Sie reduzieren
BC
zuA
in diesem Schritt zu erhaltenAACCCCCC
. In anderen Worten, ist es nicht erforderlich, zur Verringerung der leftmost-matching-substring, Sie reduzieren jeder Teilstring, der aus zwei verschiedenen Zeichen. - Scheint, wie haben Sie zu Beginn ganz rechts. So
BC
wirdA
(der Brief nicht beteiligt). Für die nächste UmstellungAC
wird zu B, dannBC
wirdA
usw. - Vielleicht, aber dann vermutlich auf diese Weise können mehrere verschiedene Lösungen für einen Eingang. Die Frage ist wirklich nicht klar!
- Wie haben Sie sich das problem? Haben Sie versucht, bei allen?
- Erwarten Sie, um die Länge der kürzesten reduziert string?
- Ja, Sie haben zu finden, die Länge der kürzest möglichen reduziert string.
- Ich denke, Sie können etwas tun, wie Dynamische Programmierung und rekursiv die Funktion aufrufen und nehmen min in allen Längen..
- Charlesworth: yup, es sind auf jeden Fall mehrere Lösungen. Ich bin einverstanden mit Howard hier, dass das Plakat interessiert ist, in der kürzest möglichen reduziert string. Und ja, die Frage ist unklar - ich glaube, ich habe gerade füllte die Lücken nach meiner eigenen Erfahrung mit solchen puzzle-Fragen 😉
- Das ist wahr, Sie können reduzieren die 2 benachbarten Zeichen irgendwo im string. es gibt keine Einschränkung, es werden die ersten beiden Zeichen
- Können Sie uns sagen, das der maximalen erwarteten Länge der Zeichenfolge, oder der vorgeschlagene Algorithmus Komplexität?
- Ich sah dieses problem auf interviewstreet.com für das erste mal und es gelöst mit Hilfe von DP. Aber, lassen Sie mich Ihnen eine Beobachtung, die möglicherweise helfen, die Entwicklung eine einfachere Lösung: Sie können beweisen, dass deine Letzte Antwort ist entweder der Länge 1 oder 2 ! die einzige Ausnahme ist, wenn die Eingabe alle ein Zeichen wie: CCCCCC
- Beweis-Idee: Stell dir vor, Sie stecken an CCCC irgendwann. denke, dass der Vorherige Schritt... sagen, Es war: CABCC. wählen Sie ein anderes paar, und Sie werden es besser machen.
- Ich denke, ähnlich kann man beweisen, dass ein greedy-Ansatz funktionieren würde. So stellen Sie sicher pick ein paar, die werden dich nicht stecken ccccccc ttttt Fällen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gehe davon aus, dass Sie sich für die Länge der kürzesten Zeichenkette, die nach der Reduktion.
Eine einfache Lösung wäre, um alle Möglichkeiten in eine gierige Art und Weise und hoffe, dass es explodiert nicht exponentiell. I ' m gonna write Python-pseudocode hier, weil das ist einfacher zu verstehen (zumindest für mich ;)):
Ich denke die Grundidee ist klar: Sie nehmen eine Warteschlange (
std::deque
sollte in Ordnung sein), fügen Sie Ihren Text hinein, und dann implementieren Sie eine einfache Breite-zuerst-Suche im Raum aller möglichen Ermäßigungen. Während der Suche, Sie nehmen das erste element aus der queue, nehmen Sie alle möglichen Teilfolgen von es, führen alle mögliche Reduzierungen, und drücken Sie die reduzierten Streichern zurück in die Warteschlange. Der gesamte Raum erkundet, wenn die Warteschlange leer ist.BC
mitA
in einen anderen Pfad, und beide Pfade sind Hinzugefügt in der Warteschlange.Θ(3^n)
?Θ((n/2)^n)
durchschnittlichen Fall..tr(s) = tr(tr(s[-1:])+s[-1])
- die naive linke die meisten edit - Nähte halten Sie für eine beliebige Zeichenfolge, die enden auf einem run der Länge 1. Ich wir könnten dies beweisen, den Fall mit mehr tailruns leicht zu handhaben wäre.Den Weg, diese Frage ist so formuliert, es gibt nur drei verschiedene Möglichkeiten:
2/3. Wenn die Zeichenfolge enthält mehr als einen einzigartigen Charakter, die Länge beträgt entweder 1 oder 2, immer (auf der Grundlage der Anordnung der Zeichen).
Bearbeiten:
Als eine Art proof-of-concept hier finden Sie einige Grammatik und Ihre Erweiterungen:
Ich sollte anmerken, dass, obwohl dies scheint mir eine angemessene Beweis für die Tatsache, dass die Länge zu reduzieren, um entweder 1 oder 2, ich bin ziemlich sicher, dass die Bestimmung, welche dieser Längen Ergebnis ist nicht so trivial, wie ich ursprünglich dachte ( Sie würden immer noch auf der Rekursion durch alle Optionen, um es herauszufinden)
wo () bezeichnet die leere Zeichenkette, und s^ eine beliebige Kombination der vorhergehenden [A,B,C,()] Zeichen.
Erweiterte Grammatik:
Das gleiche wird passieren mit erweiterten Grammatiken, beginnend mit B, und-C (andere). Die interessanten Fälle sind, wo wir haben ACB und ABC (drei verschiedene Charaktere in der Reihenfolge), in diesen Fällen führen die in Grammatiken erscheinen, führen zu längeren Längen, aber:
Rekursiv, Sie führen nur zu mehr Längen als die anderen Zeichenfolge enthält, deren Wert nur. Aber wir müssen uns daran erinnern, dass in diesem Fall kann auch vereinfacht werden, da, wenn wir Sie zu diesem Bereich sagen-CCC^, dann sind wir an einem Punkt, den vorherigen hatte ABC ( oder folglich CBA ). Wenn wir zurückblicken könnten wir bessere Entscheidungen treffen:
Also im besten Fall am Ende der Schnur, wenn wir alle die richtigen Entscheidungen, die wir Ende mit einem verbleibenden string der 1 Zeichen, gefolgt von 1 Zeichen(da sind wir am Ende). In dieser Zeit, wenn der Charakter ist der gleiche, dann haben wir eine Länge von 2, wenn es anders ist, dann reduzieren wir ein letztes mal und wir enden mit einer Länge von 1.
Können Sie verallgemeinern das Resultat, basierend auf der individuellen Anzahl Zeichen der Zeichenkette. Der algo ist wie folgt,
traverse durch die string-und die individuelle char zählen.
Können sagen, wenn
a
= no# einer ist, der im gegebenen stringb
= no# von b ist, der im gegebenen stringc
= no# c ist im gegebenen stringdann kann man sagen, dass das Ergebnis wird sein,
(odd , even)
jedera , b , c
und vertauschen der Positionen auch.Definieren wir einen Automaten mit folgenden Regeln (K>=0):
und alle Regeln, die durch Permutationen ABC, um die vollständige definition.
Alle input-strings mit einem einzigen Buchstaben sind nicht reduzierbar. Wenn der input-string enthält mindestens zwei verschiedene Buchstaben, die endgültige Staaten wie AB-oder AAB reduziert werden kann, um einen einzelnen Buchstaben, und die letzten Staaten wie ABC reduziert werden kann, um zwei Buchstaben.
Im ABC Fall, wir haben noch zu beweisen, dass der Eingabe-string nicht reduziert werden kann, um einen einzelnen Buchstaben durch eine andere Reduktion-Sequenz.
Vergleichen Sie zwei Zeichen in einer Zeit und ersetzen Sie Sie, wenn beide benachbarten Zeichen sind nicht dasselbe. Zu bekommen optimale Lösung, führen Sie einmal vom Anfang der Zeichenfolge und einmal vom Ende der Zeichenfolge. Return der minimale Wert.
}
Wäre das nicht ein guter start sein, um zu zählen, die Buchstaben, die Sie haben die meisten und suchen nach Möglichkeiten, um es zu entfernen? Halten Sie tun dies, bis wir nur einen Brief. Vielleicht haben wir es viele Male, aber solange ist es das gleiche wir kümmern uns nicht, wir sind fertig.
Vermeiden, dass so etwas wie ABCCCCCCC immer CCCCCCCC.
Entfernen wir die beliebtesten Brief:
-ABCCCCCCC
-AACCCCCC
-ABCCCCC
-AACCCC
-ABCCC
-AACC
-ABC
-AA
Ich Stimme mit den vorherigen poster, die Staaten müssen wir eine Länge von 1 oder 2 - was passiert, wenn ich geben Sie die start-Zeichenfolge AAA?
Dies ist greedy-Ansatz und die Traversierung beginnt der Pfad mit jedem möglichen paar und überprüfung der min Länge.
Folgenden NominSim die Beobachtungen, hier ist wohl eine optimale Lösung, die läuft in linearer Zeit O(1) Speicherplatz-Nutzung. Beachten Sie, dass es nur in der Lage zu finden die Länge der kleinsten Reduktion, nicht die reduzierte Strings selbst:
Gibt es einige zugrunde liegende Struktur, die verwendet werden können, zu lösen dieses problem in O(n) Zeit.
Die Regeln gegeben sind die (meisten) Regeln definieren eine mathematische Gruppe, insbesondere die Gruppe D_2 manchmal auch bekannt als K (für Klein-Gruppe vier) oder V (Deutsch für Viergruppe, vier Gruppe). D_2 ist eine Gruppe mit vier Elementen, A, B, C, und 1 (Identität-element). Eine der Erkenntnisse von D_2 ist die Menge der Symmetrien von einem rechteckigen Kasten mit drei verschiedenen Seiten. A, B, und C sind 180-Grad-Drehungen um die einzelnen Achsen, und ist 1 die Identität-rotation (keine rotation). Die Gruppe Tisch für D_2 ist
Wie Sie sehen können, die Regeln entsprechen den Regeln, die in das problem, mit der Ausnahme, dass die Regelungen, die 1 nicht in das problem.
Seit D_2 ist eine Gruppe, die es erfüllt eine Reihe von Regeln: Schließung (das Produkt von zwei Elementen der Gruppe ist ein anderes element), Assoziativität (Bedeutung
(x*y)*z = x*(y*z)
für alle Elementex
,y
,z
; d.h., die Reihenfolge, in der die Streicher reduziert werden spielt keine Rolle), die Existenz der Identität (es ist ein element1
so dass1*x=x*1=x
für allex
), und Existenz von inversen (für jedes elementx
, es ist ein elementx^{ -1}
so dassx*x^{ -1}=1 and x^{ -1}*x=1
; in unserem Fall, jedes element ist sein eigenes inverses).Es ist auch erwähnenswert, dass D_2 ist kommutativ, d.h.,
x*y=y*x
für allex,y
.Gegeben eine beliebige Zeichenfolge von Elementen in D_2, können wir reduzieren auf ein einziges element in der Gruppe in eine gierige Weise. Zum Beispiel
ABCCCCCCC=CCCCCCCC=CCCCCC=CCCC=CC=1
. Beachten Sie, dass wir nicht schreiben, das element1
es sei denn, es ist das einzige element in der Zeichenfolge. Die Assoziativität sagt uns, dass die Reihenfolge der Operationen spielt keine Rolle, z.B., könnten wir gearbeitet haben, von rechts nach Links oder begann in der Mitte und bekommen das gleiche Ergebnis. Lasst uns versuchen von der rechten Seite:ABCCCCCCC=ABCCCCC=ABCCC=ABC=AA=1
.Die situation des Problems ist anders, weil Operationen mit
1
sind nicht zulässig, so können wir nicht einfach beseitigen PaareAA
,BB
oderCC
. Die situation ist aber nicht , dass anders. Betrachten Sie die ZeichenfolgeABB
. Wir können nicht schreibenABB=A
in diesem Fall. Allerdings können wir beseitigenBB
in zwei Schritten mitA
:ABB=CB=A
. Da die Reihenfolge egal ist, von Assoziativität, sind wir garantiert das gleiche Ergebnis zu erhalten. Also wir können nicht direkt vonABB
zuA
aber wir können das gleiche Ergebnis durch eine andere route.Solche Alternative Routen verfügbar sind, Wann immer es gibt mindestens zwei unterschiedliche Elemente in einem string. In allem, in jedem
ABB
,ACC
,BAA
,BCC
,CAA
,CBB
,AAB
,AAC
,BBA
,BBC
,CCA
,CCB
, wir können handeln, als ob wir die Reduktionxx=1
und dann fallen die1
.Daraus folgt, dass jede Zeichenfolge, die ist nicht homogen, (nicht alle den gleichen Brief) und hat einen Doppel-Brief substring (
AA
,BB
oderCC
) kann reduziert werden durch die Beseitigung der doppelten Buchstaben. Strings, die nur aus zwei identischen Buchstaben können nicht weiter reduziert werden (weil es keine1
erlaubt in das problem), also es scheint sicher zu vermuten, dass alle nicht-homogene string kann reduziert werdenA
,B
,C
,AA
,BB
,CC
.Wir haben immer noch vorsichtig sein, aber, weil
CCAACC
konnte sich inCCCC
durch entfernen der mittleren paarAA
, aber das ist nicht das beste, was wir tun können:CCAACC=AACC=CC or AA
nimmt uns mit nach unten, um einen string der Länge 2.Anderen situation müssen wir vorsichtig sein, der ist
AABBBB
. Hier konnten wir beseitigenAA
zu Ende mitBBBB
, aber es ist besser, zu beseitigen, die MitteB
's erste, dann was auch immer:AABBBB=AABB=AA or BB
(beide sind gleichwertig1
in der Gruppe, aber kann nicht weiter reduziert werden das problem).Gibt es eine weitere interessante situation, die wir haben könnten:
AAAABBBB
. Blind Beseitigung von Paaren führt uns entwederAAAA
oderBBBB
, aber wir könnten noch besser:AAAABBBB=AAACBBB=AABBBB=AABB=AA or BB
.Oben zeigen, dass die Beseitigung von Doppel-blind ist nicht unbedingt die Art und Weise zu gehen, aber es war trotzdem aufschlussreich.
Stattdessen scheint es, als ob die wichtigste Eigenschaft eine Zeichenfolge ist, die nicht-Homogenität. Wenn die saite ist homogen, stop, es gibt nichts, was wir tun können. Ansonsten, identifizieren, ein Vorgang, der erhält die nicht-Homogenität-Eigenschaft, wenn möglich. Ich behaupten, dass es immer möglich ist zu identifizieren, ein Vorgang, der bewahrt nicht-Homogenität, wenn der string nicht-homogenen und der Länge vier oder mehr.
Beweis: wenn ein 4-substring enthält zwei verschiedene Briefe, ein Dritter Brief kann eingeführt werden, bei der eine Grenze zwischen zwei verschiedenen Buchstaben, z.B.
AABA
gehtACA
. Da der ein oder andere von den ursprünglichen Buchstaben müssen unverändert irgendwo in der Zeichenfolge, es folgt, dass das Ergebnis noch nicht homogen.Nehmen wir statt dessen haben wir eine 4-substring mit drei verschiedenen Elementen, sagen wir
AABC
, mit die äußeren zwei Elemente verschiedenen. Dann, wenn die zwei mittleren Elemente sind unterschiedlich, führen Sie die operation auf diese; das Ergebnis ist nicht homogen, weil die beiden äußersten Elemente sind immer noch unterschiedlich. Auf der anderen Seite, wenn die beiden inneren Elemente sind die gleichen, z.B.ABBC
, dann haben Sie, anders zu sein als die beiden äußersten Elemente (sonst würden wir nur zwei Elemente in der Reihe von vier, nicht drei). In diesem Fall führen Sie entweder die erste oder die Dritte operation; das lässt entweder die beiden letzten Elemente unterschiedlich ist (z.B.,ABBC=CBC
) oder die ersten beiden Elemente unterschiedlich ist (z.B.,ABBC=ABA
) so nicht-Homogenität erhalten bleibt.Schließlich betrachten wir den Fall, wo die ersten und letzten Elemente sind die gleichen. Dann haben wir eine situation wie
ABCA
. Die zwei mittleren Elemente beide haben, anders zu sein als die äußeren Elemente, sonst hätten wir nur noch zwei Elemente in diesem Fall nicht drei. Wir können nehmen Sie den ersten verfügbaren BetriebABCA=CCA
- und non-Homogenität bewahrt wird, wieder.Ende der Beweis.
Haben wir einen greedy-Algorithmus zur Verringerung der nicht-homogenen string der Länge 4 oder größer: wählen Sie die erste Vorgang, der bewahrt nicht-Homogenität; diese muss eine operation existieren, die von den oben genannten argument.
Wir haben nun reduziert auf den Fall, wo wir eine nicht-homogene saite der 3 Elemente. Wenn zwei die gleichen, entweder haben wir verdoppelt wie
AAB
etc., was wir wissen, können reduziert werden, um ein einzelnes element, oder wir haben zwei Elemente, die keine Doppel-wieABA=AC=B
kann auch reduziert werden, um ein einzelnes element, oder wir haben drei verschiedene Elemente wieABC
. Es gibt sechs Permutationen, die alle=1
in der Gruppe, die durch die Assoziativität und commutativity; alle von Ihnen können reduziert werden, um zwei Elemente, die von jedem Betrieb, aber Sie können unter keinen Umständen reduziert werden unter eine homogene pair (AA
,BB
oderCC
) seit1
ist, dürfen Sie nicht in das problem, so wissen wir, dass ist das beste, was wir tun können, in diesem Fall.In der Zusammenfassung, falls eine saite ist homogen, es gibt nichts, was wir tun können, wenn eine saite nicht homogen und die
=A
in der Gruppe, kann es reduziert werden, umA
in das problem durch einen greedy-Algorithmus, die behauptet, die nicht-Homogenität bei jedem Schritt; das gleiche gilt, wenn der string=B
oder=C
in der Gruppe; schließlich, wenn Sie eine Zeichenfolge ist nicht homogen und die=1
in der Gruppe, es kann reduziert werden, indem ein greedy-Algorithmus, die behauptet, die nicht-Homogenität, so lange wie möglich einAA
,BB
oderCC
. Das sind die besten, die wir tun können, indem Sie die Eigenschaften der Gruppe der operation.Programm die Lösung des Problems:
Nun, da wir wissen, dass die möglichen Ergebnisse, die unser Programm ausgeführt werden kann, in
O(n)
Zeit wie folgt: wenn alle Buchstaben in der gegebenen Folge sind die gleichen, keine Reduzierung möglich ist, also nur die Ausgabe der Länge der Zeichenkette. Wenn der string ist nicht homogen, und ist gleich um die Identität in der Gruppe, die Ausgabe die Zahl "2"; sonst Ausgabe die Nummer 1.Schnell entscheiden, ob ein element entspricht der Identität in der Gruppe, wir verwenden commutativity und Assoziativität wie folgt: nur die Anzahl der
A
's,B
's undC
's in der Variablena
,b
,c
. Ersetzena = a mod 2
,b = b mod 2
,c = c mod 2
weil wir beseitigen können PaareAA
,BB
, undCC
in der Gruppe. Wenn keine der resultierendena
,b
,c
ist gleich 0, wir habenABC=1
in der Gruppe, so sollte das Programm die Ausgabe 2, da eine Reduktion auf die Identität1
ist nicht möglich. Wenn alle drei der resultierendena
,b
,c
sind gleich 0 ist, haben wir wieder die Identität (A
,B
, undC
alle storniert sich von selbst) also sollten wir die Ausgabe 2. Andernfalls wird die Zeichenfolge nicht-Identität, und wir sollten die Ausgabe-1.}
Vergleichen Sie zwei Zeichen in einer Zeit und ersetzen Sie Sie, wenn beide benachbarten Zeichen sind nicht dasselbe. Zu bekommen optimale Lösung, führen Sie einmal vom Anfang der Zeichenfolge und einmal vom Ende der Zeichenfolge. Return der minimale Wert.
Rav Lösung ist :-
}
@Rav
dieser code wird nicht für die Eingabe "abccaccba".
Lösung sollte nur "b"
aber dieser code wird nicht geben. Da bin ich nicht immer richtigen Kommentar platzieren(wegen der niedrigen Punkte oder aus einem anderen Grund), so habe ich es hier.
Dieses problem kann gelöst werden, indem die greedy-Ansatz. Versuchen zu finden die beste position zu übernehmen, bis keine transformation transformation existiert. Die beste position ist die position mit maximaler Anzahl von verschiedenen Nachbarn von den transformierten Charakter.
Lösen können Sie dieses mit 2 pass.
Im ersten Durchgang, die Sie anwenden,
Und im 2. pass werden Sie die gleichen auf 'output1', um das Ergebnis zu erhalten.
So, Einer ist nach vorne gehen, eine andere ist die backward-pass.
}