Sie erhalten eine verschlüsselte Nachricht, die nur Zahlen enthält. Sie erhalten auch das folgende Mapping
%Vor%Geben Sie eine codierte Nachricht an, und zählen Sie die Anzahl der Möglichkeiten, wie sie dekodiert werden kann.
zB: 12
kann auf zwei Arten dekodiert werden: (A, B) und (L)
Ich habe den Algorithmus gefunden, die Zahlen als Zeichenkette zu akzeptieren und dann nach jeder Ziffer zu suchen:
%Vor%Jedes Mal, wenn ich versuche, die erste Ziffer in der Nachricht zu einem Buchstaben zu kodieren, oder ich kann die ersten zwei Ziffern, wenn möglich, in einen Buchstaben kodieren. Wenn es keine Möglichkeit gibt, zu codieren, als würde man auf eine einzelne "0" treffen oder auf "32" stoßen, dann einfach zurückgeben.
Kann dieses Problem effizienter gelöst werden?
Ihre aktuelle Annäherung an das Problem ist korrekt. Obwohl, Sie müssen wirklich vorsichtig sein, dass Sie alle Fälle behandeln, die es nicht klar ist, und das wird meine Antwort ein bisschen länger als nötig machen.
Eine korrekte Methode, dieses Problem zu sehen, ist eine dynamische Programmierung Perspektive. Betrachten wir Ihre Eingabe als message
und ihre Länge als n
.
Um ein message
von n
Zeichen zu dekodieren, müssen Sie wissen, auf wie viele Arten Sie message
mit n - 1
Zeichen und ein message
mit n - 2
Zeichen dekodieren können. Das heißt,
Eine Nachricht von n
Zeichen.
Verwenden einer 1-stelligen und einer message
von n - 1
Zeichen lang.
Verwenden Sie eine 2-stellige und eine message
von n - 2
Zeichen lang.
Nun können Sie sich fragen:
Wie berechne ich, auf wie viele Arten Sie
message
vonn - 1
Zeichen und vonn - 2
Zeichen dekodieren können?
Es ist eigentlich genauso. Schließlich werden Sie es auf seinen Basisfall reduzieren.
Sagen wir ways[n]
ist die Anzahl der Möglichkeiten, wie Sie message
von n
Zeichen dekodieren können. Dann können Sie ways[n]
auf diese Weise setzen,
(Da es keine Ahnung gibt, wie Sie die Anzahl der Möglichkeiten für eine leere Zeichenkette definieren würden, betrachtete ich das als 1
.)
Mit geeigneten Einschränkungen und dem Basisfall
n = 0
,
n > 1
und message[n]
ist gültig und message[n - 1:n]
ist gültig,
n > 1
und message[n]
ist gültig und message[n - 1:n]
ist nicht gültig,
n > 1
und message[n]
ist nicht gültig und message[n - 1:n]
ist gültig,
andernfalls
%Vor% Eine iterative decode
Funktion in C kann wie folgt aussehen,
Sie können es hier bei ideone sehen. Ich verwende konstanten zusätzlichen Speicher für die Berechnung.