Inhaltsverzeichnis
Beispiel
Methode 2
Algorithmus
Ausgabe
示例
输出
Heim Backend-Entwicklung C++ Dekodieren Sie rekursiv eine Zeichenfolge, die als Anzahl gefolgt von einer Teilzeichenfolge codiert ist

Dekodieren Sie rekursiv eine Zeichenfolge, die als Anzahl gefolgt von einer Teilzeichenfolge codiert ist

Sep 09, 2023 pm 01:53 PM
编码 递归 解码

Dekodieren Sie rekursiv eine Zeichenfolge, die als Anzahl gefolgt von einer Teilzeichenfolge codiert ist

In diesem Problem müssen wir die gegebene Zeichenfolge dekodieren, indem wir die Gesamtzahl wiederholt addieren.

Wir können das Problem auf drei verschiedene Arten angehen und können zwei Stapel oder einen Stapel verwenden, um das Problem zu lösen. Wir können das Problem auch lösen, ohne zwei Stapel zu verwenden.

Problemstellung – Wir erhalten eine Zeichenfolge str, die linke und rechte Klammern, Buchstaben und numerische Zeichen enthält. Wir müssen die Zeichenfolge rekursiv dekodieren.

Im Folgenden sind die Muster oder Regeln zum Dekodieren von Zeichenfolgen aufgeführt.

  • [chars] – „chars“ sollten in der Ergebniszeichenfolge mehrere Male vorkommen.

Beispiel

Eintreten

str = "2[d]3[c2[n]]";
Nach dem Login kopieren

Ausgabe

ddcnncnncnn
Nach dem Login kopieren

Anleitung

  • Zuerst dekodieren wir 2[n] und erhalten „2[d]3[cnn]“.

  • Als nächstes dekodieren wir 3[cnn]. Wir erhalten also „2[d]cnnncnncnn“.

  • Als nächstes dekodieren wir 2[d]. Also erhalten wir „ddcnnncnncnn“.

Eintreten

5[i]
Nach dem Login kopieren

Ausgabe

iiiii
Nach dem Login kopieren

Erklärung – Wenn wir die gegebene Zeichenfolge dekodieren, erhalten wir 5 „I“.

Eintreten

3[fg]
Nach dem Login kopieren

Ausgabe

fgfgfg
Nach dem Login kopieren

Erklärung- Wenn wir die Eingabezeichenfolge dekodieren, erhalten wir dreimal „fg“.

Methode 1

Wir werden bei dieser Methode zwei Stapel verwenden, um das Problem zu lösen. Wenn wir eine öffnende Klammer erhalten, legen wir sie auf den Stapel. Wenn wir außerdem numerische Zeichen erhalten, hängen wir alle numerischen Zeichen an eine gültige positive Ganzzahl an und fügen sie dem Ganzzahlstapel hinzu. Wenn wir anschließend die schließende Klammer erhalten, entfernen wir die Ganzzahl und das Zeichen vom Stapel.

Algorithmus

Schritt 1- Definieren Sie den Stapel „instSt“ zum Speichern von Zahlen und „strSt“ zum Speichern von Zeichenfolgen und linken Klammern. Darüber hinaus wird „answer“ initialisiert, um die Ergebniszeichenfolge zu speichern, und „tempStr“ wird initialisiert, um die temporäre Zeichenfolge zu speichern.

Schritt 2 – Beginnen Sie mit dem Durchqueren der Saite.

Schritt 3 – Wenn das aktuelle Zeichen eine Zahl ist, initialisieren Sie „num“ mit 0, um die Zahl zu speichern.

Schritt 3.1 − Wenn das Zeichen am ptenten Index eine Zahl ist, durchlaufen Sie die Zeichenfolge, bis Sie ein alphabetisches Zeichen oder eine Klammer erhalten. Multiplizieren Sie innerhalb der Schleife den vorherigen Wert von „num“ mit 10 und addieren Sie die aktuelle Zahl dazu.

Schritt 3.2− Erhöhen Sie den Wert von „p“ um 1.

Schritt 3.3 - Schieben Sie den numerischen Wert auf den Stapel „instSt“.

Schritt 4 - Wenn das Zeichen am p-ten Index eine rechte Klammer ist, befolgen Sie diese Schritte.

Schritt 4.1 – Initialisieren Sie „temp_str“ mit einer leeren Zeichenfolge. Wenn „instSt“ anschließend nicht leer ist, entfernen Sie die oberste Ganzzahl vom Stapel.

Schritt 4.2 - Verwenden Sie nun eine Schleife, bis wir die linke Klammer erhalten oder der Stapel vom Stapel „strSt“ leer wird. Hängen Sie außerdem Zeichen an „temp_str“ an.

Schritt 4.3 - Wenn wir wegen „[“ aufgehört haben, das Zeichen zu kacken, entfernen Sie es.

Schritt 4.4 - Als nächstes müssen wir „temp_Str“ „num“ mal an die „answer“-Zeichenfolge anhängen.

Schritt 4.5 - Fügen Sie jedes Zeichen der Zeichenfolge „answer“ in den Stapel „strSt“ ein und initialisieren Sie ihn mit einer leeren Zeichenfolge neu.

Schritt 5 − Wenn das aktuelle Zeichen eine linke Klammer ist, befolgen Sie bitte die folgenden Schritte.

Schritt 5.1 − Wenn das vorherige Zeichen eine Zahl ist, schieben Sie „[“ auf den Stapel „StrSt“. Andernfalls schieben Sie „[“ auf den StrSt-Stapel und 1 auf den „instSt“-Stapel.

Schritt 6− Wenn wir ein alphabetisches Zeichen erhalten, schieben Sie es auf den Stapel „strSt“.

Schritt 7 – Abschließend verwenden Sie eine Schleife, um alle Zeichen aus dem Stapel „strSt“ zu entfernen, an die Zeichenfolge „answer“ anzuhängen und diese zurückzugeben.

Beispiel

#include 
using namespace std;

string decodeTheString(string alpha) {
    stack instSt;
    stack StrSt;
    string tempStr = "", answer = "";
    // Iterate the string
    for (int p = 0; p < alpha.length(); p++) {
        int num = 0;
        // If we find the number, extract the number and push it to the stack
        if (alpha[p] >= '0' && alpha[p] <= '9') {
            // Making iterations until we get an alphabetic character
            while (alpha[p] >= '0' && alpha[p] <= '9') {
                num = num * 10 + alpha[p] - '0';
                p++;
            }
            p--;
            instSt.push(num);
        }
        // If the character at the pth index is closing bracket
        else if (alpha[p] == ']') {
            tempStr = "";
            num = 0;
            // Pop the number from the stack
            if (!instSt.empty()) {
                num = instSt.top();
                instSt.pop();
            }
            // Pop the character until we get the opening bracket
            while (!StrSt.empty() && StrSt.top() != '[') {
                tempStr = StrSt.top() + tempStr;
                StrSt.pop();
            }
            // remove the opening bracket
            if (!StrSt.empty() && StrSt.top() == '[')
                StrSt.pop();
            // Append string to answer for num times
            for (int j = 0; j < num; j++)
                answer = answer + tempStr;
            // Insert the updated string again into the stack
            for (int j = 0; j < answer.length(); j++)
                StrSt.push(answer[j]);
            answer = "";
        }
        // If the character at the pth index is an opening bracket
        else if (alpha[p] == '[') {
            if (alpha[p - 1] >= '0' && alpha[p - 1] <= '9') {
                StrSt.push(alpha[p]);
            } else {
                StrSt.push(alpha[p]);
                instSt.push(1);
            }
        } else {
            // Push alphabetic character in the string stack.
            StrSt.push(alpha[p]);
        }
    }
    // Pop all the elements, make a string, and return.
    while (!StrSt.empty()) {
        answer = StrSt.top() + answer;
        StrSt.pop();
    }
    return answer;
}
// starting code
int main() {
    string str = "2[d]3[c2[n]]";
    cout << "The resultant string after decoding it is - " << decodeTheString(str) << endl;
    return 0;
}
Nach dem Login kopieren

Ausgabe

The resultant string after decoding it is - ddcnncnncnn
Nach dem Login kopieren

Zeitliche Komplexität− O(n^2), da wir über die Zeichenfolge iterieren und weiterhin Elemente auf den Stapel schieben und ablegen.

Space Complexity− O(n) zum Speichern von Elementen im Stapel.

Methode 2

Wir werden das Problem lösen, ohne bei dieser Methode einen Stapel zu verwenden. Zusätzlich verwenden wir die Methode reverse(), um die Zeichenfolge umzukehren.

Algorithmus

Schritt 1 – Beginnen Sie mit der Iteration über die Zeichenfolge.

Schritt 2− Wenn das i-te Zeichen „]“ ist, schieben Sie es in die „Antwort“-Zeichenfolge. Befolgen Sie andernfalls die folgenden Schritte.

Schritt 3 – Initialisieren Sie „temp_Str“ mit einer leeren Zeichenfolge.

Schritt 4 – Durchlaufen Sie die Zeichenfolge „Antwort“ weiter, bis die Zeichenfolge leer ist oder das Zeichen „[“ gefunden wird. Entfernen Sie außerdem weiterhin das letzte Zeichen aus der Zeichenfolge „answer“ und hängen Sie es an die Zeichenfolge „temp_Str“ an.

Schritt 5 – Kehren Sie die Zeichenfolge „temp_Str“ um, während wir von der Stelle, an der wir die Klammer „]“ gefunden haben, rückwärts gehen.

Schritt 6 – Entfernen Sie das letzte Zeichen aus der „Antwort“-Zeichenfolge, um das „[“-Zeichen zu entfernen.

第 7 步- 如果“答案”字符串顶部包含数字,则使用数字生成一个整数,并将其存储在 number 变量中。

第 8 步- 反转数字字符串。

第 9 步- 使用 stoi() 方法将字符串转换为数字。

步骤 10 - 将 temp_Str 字符串附加到答案字符串“number”次。

第 11 步- 返回“答案”字符串。

示例

#include 
using namespace std;

string decodeTheString(string alpha) {
    string answer = "";
    // iterate the string characters
    for (int i = 0; i < alpha.length(); i++) {
        // for all other characters except the closing bracket
        if (alpha[i] != ']') {
            answer.push_back(alpha[i]);
        } else {
            // Extract the substring lying within the pair
            string temp_str = "";
            // Keep on popping characters until '[' is found.
            while (!answer.empty() && answer.back() != '[') {
                temp_str.push_back(answer.back());
                answer.pop_back();
            }
            // get original string by reversing the string
            reverse(temp_str.begin(), temp_str.end());
            // open bracket removal
            answer.pop_back();
            // get integer value before the '[' character
            string number = "";
            // get the number before opening bracket
            while (!answer.empty() && answer.back() >= '0' && answer.back() <= '9') {
                number.push_back(answer.back());
                answer.pop_back();
            }
            // reverse number string
            reverse(number.begin(), number.end());
            // convert string to integer
            int numInt = stoi(number);
            for (int p = 0; p < numInt; p++) {
                answer += temp_str;
            }
        }
    }
    return answer;
}
int main() {
    string str = "2[d]3[c2[n]]";
    cout << "The resultant string after decoding it is - " << decodeTheString(str) << endl;
    return 0;
}
Nach dem Login kopieren

输出

The resultant string after decoding it is − ddcnncnncnn
Nach dem Login kopieren

时间复杂度− O(N^2),因为我们遍历字符串并在循环内使用reverse()方法。

空间复杂度− O(N) 来存储数字和临时字符串。

Das obige ist der detaillierte Inhalt vonDekodieren Sie rekursiv eine Zeichenfolge, die als Anzahl gefolgt von einer Teilzeichenfolge codiert ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Rekursive Implementierung von C++-Funktionen: Gibt es eine Grenze für die Rekursionstiefe? Rekursive Implementierung von C++-Funktionen: Gibt es eine Grenze für die Rekursionstiefe? Apr 23, 2024 am 09:30 AM

Die Rekursionstiefe von C++-Funktionen ist begrenzt und das Überschreiten dieser Grenze führt zu einem Stapelüberlauffehler. Der Grenzwert variiert je nach System und Compiler, liegt aber meist zwischen 1.000 und 10.000. Zu den Lösungen gehören: 1. Tail-Rekursionsoptimierung; 2. Tail-Call;

Unterstützen C++-Lambda-Ausdrücke die Rekursion? Unterstützen C++-Lambda-Ausdrücke die Rekursion? Apr 17, 2024 pm 09:06 PM

Ja, C++-Lambda-Ausdrücke können die Rekursion mithilfe von std::function unterstützen: Verwenden Sie std::function, um einen Verweis auf einen Lambda-Ausdruck zu erfassen. Mit einer erfassten Referenz kann sich ein Lambda-Ausdruck rekursiv selbst aufrufen.

Zählen Sie rekursiv die Anzahl der Vorkommen eines Teilstrings in Java Zählen Sie rekursiv die Anzahl der Vorkommen eines Teilstrings in Java Sep 17, 2023 pm 07:49 PM

Gegeben seien zwei Strings str_1 und str_2. Das Ziel besteht darin, mithilfe eines rekursiven Verfahrens die Anzahl der Vorkommen der Teilzeichenfolge str2 in der Zeichenfolge str1 zu zählen. Eine rekursive Funktion ist eine Funktion, die sich innerhalb ihrer Definition selbst aufruft. Wenn str1 „Iknowthatyouknowthatiknow“ und str2 „know“ ist, beträgt die Anzahl der Vorkommen -3. Lassen Sie uns das anhand von Beispielen verstehen. Geben Sie beispielsweise str1="TPisTPareTPamTP", str2="TP" ein; geben Sie Countofoccurrencesofasubstringrecursi aus

Rekursive Implementierung von C++-Funktionen: Vergleichende Analyse rekursiver und nichtrekursiver Algorithmen? Rekursive Implementierung von C++-Funktionen: Vergleichende Analyse rekursiver und nichtrekursiver Algorithmen? Apr 22, 2024 pm 03:18 PM

Der rekursive Algorithmus löst strukturierte Probleme durch den Selbstaufruf von Funktionen. Der Vorteil besteht darin, dass er einfach und leicht zu verstehen ist. Der Nachteil besteht jedoch darin, dass er weniger effizient ist und einen Stapelüberlauf verursachen kann Der Vorteil der Stapeldatenstruktur besteht darin, dass sie effizienter ist und einen Stapelüberlauf vermeidet. Der Nachteil besteht darin, dass der Code möglicherweise komplexer ist. Die Wahl zwischen rekursiv und nicht rekursiv hängt vom Problem und den spezifischen Einschränkungen der Implementierung ab.

Knowledge Graph: der ideale Partner für große Modelle Knowledge Graph: der ideale Partner für große Modelle Jan 29, 2024 am 09:21 AM

Große Sprachmodelle (LLMs) sind in der Lage, flüssige und kohärente Texte zu generieren, was neue Perspektiven für Bereiche wie Konversation mit künstlicher Intelligenz und kreatives Schreiben eröffnet. Allerdings weist LLM auch einige wesentliche Einschränkungen auf. Erstens beschränkt sich ihr Wissen auf Muster, die aus Trainingsdaten erkannt werden, und es mangelt ihnen an einem echten Verständnis der Welt. Zweitens sind die Denkfähigkeiten begrenzt und können keine logischen Schlussfolgerungen ziehen oder Fakten aus mehreren Datenquellen zusammenführen. Bei komplexeren und offeneren Fragen können die Antworten von LLM absurd oder widersprüchlich werden, was als „Illusionen“ bekannt ist. Obwohl LLM in einigen Aspekten sehr nützlich ist, weist es dennoch gewisse Einschränkungen bei der Bearbeitung komplexer Probleme und realer Situationen auf. Um diese Lücken zu schließen, sind in den letzten Jahren Retrieval-Augmented-Generation-Systeme (RAG) entstanden

Mehrere gängige Kodierungsmethoden Mehrere gängige Kodierungsmethoden Oct 24, 2023 am 10:09 AM

Zu den gängigen Kodierungsmethoden gehören ASCII-Kodierung, Unicode-Kodierung, UTF-8-Kodierung, UTF-16-Kodierung, GBK-Kodierung usw. Ausführliche Einführung: 1. Die ASCII-Kodierung ist der früheste Zeichenkodierungsstandard und verwendet 7-Bit-Binärzahlen zur Darstellung von 128 Zeichen, einschließlich englischer Buchstaben, Zahlen, Satzzeichen, Steuerzeichen usw. 2. Die Unicode-Kodierung ist eine Methode zur Darstellung alle Zeichen der Welt Die Standardkodierungsmethode für Zeichen, die jedem Zeichen einen eindeutigen digitalen Codepunkt zuweist. 3. UTF-8-Kodierung usw.

Detaillierte Erläuterung der C++-Funktionsrekursion: Anwendung der Rekursion bei der Zeichenfolgenverarbeitung Detaillierte Erläuterung der C++-Funktionsrekursion: Anwendung der Rekursion bei der Zeichenfolgenverarbeitung Apr 30, 2024 am 10:30 AM

Eine rekursive Funktion ist eine Technik, die sich selbst wiederholt aufruft, um ein Problem bei der Zeichenfolgenverarbeitung zu lösen. Es erfordert eine Beendigungsbedingung, um eine unendliche Rekursion zu verhindern. Rekursion wird häufig bei Operationen wie der String-Umkehr und der Palindromprüfung verwendet.

Wie implementiert man die Kodierung und Dekodierung chinesischer Zeichen in der C-Sprachprogrammierung? Wie implementiert man die Kodierung und Dekodierung chinesischer Zeichen in der C-Sprachprogrammierung? Feb 19, 2024 pm 02:15 PM

In der modernen Computerprogrammierung ist die Sprache C eine der am häufigsten verwendeten Programmiersprachen. Obwohl die C-Sprache selbst die chinesische Kodierung und Dekodierung nicht direkt unterstützt, können wir einige Technologien und Bibliotheken verwenden, um diese Funktion zu erreichen. In diesem Artikel wird erläutert, wie die chinesische Kodierung und Dekodierung in C-Sprachprogrammiersoftware implementiert wird. Um die chinesische Kodierung und Dekodierung zu implementieren, müssen wir zunächst die Grundkonzepte der chinesischen Kodierung verstehen. Derzeit ist das am häufigsten verwendete chinesische Codierungsschema die Unicode-Codierung. Die Unicode-Kodierung weist jedem Zeichen einen eindeutigen numerischen Wert zu, sodass bei der Berechnung

See all articles