Table des matières
Exemple
Méthode 2
Algorithme
Sortie
示例
输出
Maison développement back-end C++ Décoder de manière récursive une chaîne codée sous forme de nombre suivi d'une sous-chaîne

Décoder de manière récursive une chaîne codée sous forme de nombre suivi d'une sous-chaîne

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

Décoder de manière récursive une chaîne codée sous forme de nombre suivi dune sous-chaîne

Dans ce problème, nous devons décoder la chaîne donnée en ajoutant le nombre total de fois à plusieurs reprises.

Nous pouvons aborder le problème de trois manières différentes et utiliser deux piles ou une pile pour résoudre le problème. De plus, nous pouvons résoudre le problème sans utiliser deux piles.

Énoncé du problème - On nous donne une chaîne str contenant des crochets gauche et droit, des caractères alphabétiques et numériques. Nous devons décoder la chaîne de manière récursive.

Voici les modèles ou règles de décodage des chaînes.

  • [chars] - "chars" doit apparaître plusieurs fois dans la chaîne de résultat.

Exemple

Entrez

str = "2[d]3[c2[n]]";
Copier après la connexion

Sortie

ddcnncnncnn
Copier après la connexion

Instructions

  • Tout d'abord, nous décodons 2[n] et obtenons "2[d]3[cnn]".

  • Ensuite, nous décodons 3[cnn]. Nous obtenons donc "2[d]cnnncnncnn".

  • Ensuite, nous décodons 2[d]. Nous obtenons donc "ddcnnncnncnn".

Entrez

5[i]
Copier après la connexion

Sortie

iiiii
Copier après la connexion

Explication- Lorsque nous décodons la chaîne donnée, nous obtenons 5 "I".

Entrez

3[fg]
Copier après la connexion

Sortie

fgfgfg
Copier après la connexion

Explication- Lorsque nous décodons la chaîne d'entrée, nous obtenons "fg" 3 fois.

Méthode 1

Nous utiliserons deux piles pour résoudre le problème dans cette méthode. Lorsque nous obtenons une parenthèse ouvrante, nous la plaçons sur la pile. De plus, lorsque nous obtenons des caractères numériques, nous ajoutons tous les caractères numériques à un entier positif valide et les ajoutons à la pile d'entiers. Ensuite, lorsque nous obtenons le crochet fermant, nous retirons l’entier et le caractère de la pile.

Algorithme

Étape 1- Définissez la pile "instSt" pour stocker les nombres et "strSt" pour stocker les caractères de chaîne et les crochets gauches. De plus, « answer » est initialisé pour stocker la chaîne de résultat et « tempStr » est initialisé pour stocker la chaîne temporaire.

Étape 2- Commencez à parcourir la chaîne.

Étape 3- Si le caractère actuel est un nombre, initialisez "num" avec 0 pour stocker le nombre.

Étape 3.1 − Si le caractère au pièmeième index est un nombre, parcourez la chaîne jusqu'à ce que vous obteniez un caractère alphabétique ou une parenthèse. Dans la boucle, multipliez la valeur précédente de "num" par 10 et ajoutez-y le nombre actuel.

Étape 3.2− Augmentez la valeur de « p » de 1.

Étape 3.3 - Poussez la valeur numérique vers la pile "instSt".

Étape 4 - Si le caractère à l'index pth est un crochet droit, suivez ces étapes.

Étape 4.1- Initialisez "temp_str" avec une chaîne vide. Ensuite, si 'instSt' n'est pas vide, retirez le premier entier de la pile.

Étape 4.2 - Maintenant, utilisez une boucle jusqu'à ce que nous obtenions le support gauche ou que la pile devienne vide de la pile "strSt". Ajoutez également des caractères à "temp_str".

Étape 4.3 - Si nous avons arrêté de faire caca sur le personnage à cause de "[", supprimez-le.

Étape 4.4 - Ensuite, nous devons ajouter "temp_Str" "num" fois à la chaîne "answer".

Étape 4.5 - Insérez chaque caractère de la chaîne "réponse" dans la pile "strSt" et réinitialisez-la avec une chaîne vide.

Étape 5 − Si le caractère actuel est un crochet gauche, veuillez suivre les étapes ci-dessous.

Étape 5.1 − Si le caractère précédent est un nombre, poussez "[" sur la pile "StrSt". Sinon, poussez "[" sur la pile StrSt et poussez 1 sur la pile "instSt".

Étape 6− Si nous obtenons un caractère alphabétique, placez-le sur la pile "strSt".

Étape 7- Enfin, utilisez une boucle pour supprimer tous les caractères de la pile "strSt", ajoutez-les à la chaîne "réponse" et renvoyez-la.

Exemple

#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;
}
Copier après la connexion

Sortie

The resultant string after decoding it is - ddcnncnncnn
Copier après la connexion

Complexité temporelle− O(n^2) car nous parcourons la chaîne et continuons à pousser et à faire apparaître des éléments dans la pile.

Space Complexity− O(n) pour stocker les éléments dans la pile.

Méthode 2

Nous résoudrons le problème sans utiliser de stack dans cette méthode. De plus, nous utiliserons la méthode reverse() pour inverser la chaîne.

Algorithme

Étape 1- Commencez à parcourir la chaîne.

Étape 2− Si le i-ème caractère est "]", insérez-le dans la chaîne "réponse". Sinon, suivez les étapes ci-dessous.

Étape 3- Initialisez "temp_Str" avec une chaîne vide.

Étape 4- Continuez à parcourir la chaîne "réponse" jusqu'à ce que la chaîne soit vide ou que le caractère "[" soit trouvé. Continuez également à extraire le dernier caractère de la chaîne "answer" et à l'ajouter à la chaîne "temp_Str".

Étape 5- Inversez la chaîne "temp_Str" pendant que nous reculons à partir de l'endroit où nous avons trouvé le support "]".

Étape 6- Supprimez le dernier caractère de la chaîne "réponse" pour supprimer le caractère "[".

第 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;
}
Copier après la connexion

输出

The resultant string after decoding it is − ddcnncnncnn
Copier après la connexion

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Implémentation récursive des fonctions C++ : existe-t-il une limite à la profondeur de récursion ? Implémentation récursive des fonctions C++ : existe-t-il une limite à la profondeur de récursion ? Apr 23, 2024 am 09:30 AM

La profondeur de récursion des fonctions C++ est limitée et le dépassement de cette limite entraînera une erreur de débordement de pile. La valeur limite varie selon les systèmes et les compilateurs, mais se situe généralement entre 1 000 et 10 000. Les solutions incluent : 1. Optimisation de la récursion de queue ; 2. Appel de queue ; 3. Implémentation itérative ;

Les expressions lambda C++ prennent-elles en charge la récursivité ? Les expressions lambda C++ prennent-elles en charge la récursivité ? Apr 17, 2024 pm 09:06 PM

Oui, les expressions C++ Lambda peuvent prendre en charge la récursivité à l'aide de std::function : utilisez std::function pour capturer une référence à une expression Lambda. Avec une référence capturée, une expression Lambda peut s'appeler de manière récursive.

Implémentation récursive de fonctions C++ : Analyse comparative des algorithmes récursifs et non récursifs ? Implémentation récursive de fonctions C++ : Analyse comparative des algorithmes récursifs et non récursifs ? Apr 22, 2024 pm 03:18 PM

L'algorithme récursif résout des problèmes structurés grâce à l'auto-appel de fonctions. L'avantage est qu'il est simple et facile à comprendre, mais l'inconvénient est qu'il est moins efficace et peut provoquer un débordement de pile. L'algorithme non récursif évite la récursion en gérant explicitement le. structure de données de pile. L'avantage est qu'il est plus efficace et évite le débordement de pile, l'inconvénient est que le code peut être plus complexe. Le choix du récursif ou du non récursif dépend du problème et des contraintes spécifiques de la mise en œuvre.

Compter le nombre d'occurrences d'une sous-chaîne de manière récursive en Java Compter le nombre d'occurrences d'une sous-chaîne de manière récursive en Java Sep 17, 2023 pm 07:49 PM

Étant donné deux chaînes str_1 et str_2. Le but est de compter le nombre d'occurrences de la sous-chaîne str2 dans la chaîne str1 en utilisant une procédure récursive. Une fonction récursive est une fonction qui s'appelle dans sa définition. Si str1 est "Je sais que vous savez que je sais" et str2 est "savoir", le nombre d'occurrences est de -3 Comprenons à travers des exemples. Par exemple, entrez str1="TPisTPareTPamTP", str2="TP" ; sortie Countofoccurrencesofasubstringrecursi.

Knowledge graph : le partenaire idéal des grands modèles Knowledge graph : le partenaire idéal des grands modèles Jan 29, 2024 am 09:21 AM

Les grands modèles linguistiques (LLM) ont la capacité de générer un texte fluide et cohérent, ouvrant de nouvelles perspectives dans des domaines tels que la conversation par intelligence artificielle et l'écriture créative. Cependant, le LLM présente également certaines limites clés. Premièrement, leurs connaissances se limitent aux modèles reconnus à partir des données de formation, sans une véritable compréhension du monde. Deuxièmement, les capacités de raisonnement sont limitées et ne peuvent pas faire de déductions logiques ni fusionner des faits provenant de plusieurs sources de données. Face à des questions plus complexes et ouvertes, les réponses de LLM peuvent devenir absurdes ou contradictoires, ce que l'on appelle des « illusions ». Par conséquent, bien que le LLM soit très utile à certains égards, il présente néanmoins certaines limites lorsqu’il s’agit de problèmes complexes et de situations du monde réel. Afin de combler ces lacunes, des systèmes de génération augmentée par récupération (RAG) ont vu le jour ces dernières années.

Plusieurs méthodes de codage courantes Plusieurs méthodes de codage courantes Oct 24, 2023 am 10:09 AM

Les méthodes de codage courantes incluent le codage ASCII, le codage Unicode, le codage UTF-8, le codage UTF-16, le codage GBK, etc. Introduction détaillée : 1. Le codage ASCII est la première norme de codage de caractères, utilisant des nombres binaires de 7 bits pour représenter 128 caractères, y compris des lettres anglaises, des chiffres, des signes de ponctuation, des caractères de contrôle, etc. 2. Le codage Unicode est une méthode utilisée pour représenter ; tous les caractères du monde La méthode d'encodage standard des caractères, qui attribue un point de code numérique unique à chaque caractère 3. Encodage UTF-8, etc.

Explication détaillée de la récursivité des fonctions C++ : application de la récursivité dans le traitement des chaînes Explication détaillée de la récursivité des fonctions C++ : application de la récursivité dans le traitement des chaînes Apr 30, 2024 am 10:30 AM

Une fonction récursive est une technique qui s'appelle à plusieurs reprises pour résoudre un problème de traitement de chaînes. Cela nécessite une condition de terminaison pour empêcher une récursion infinie. La récursivité est largement utilisée dans des opérations telles que l'inversion de chaînes et la vérification du palindrome.

Comment implémenter l'encodage et le décodage des caractères chinois dans la programmation en langage C ? Comment implémenter l'encodage et le décodage des caractères chinois dans la programmation en langage C ? Feb 19, 2024 pm 02:15 PM

Dans la programmation informatique moderne, le langage C est l’un des langages de programmation les plus couramment utilisés. Bien que le langage C lui-même ne prenne pas directement en charge l'encodage et le décodage chinois, nous pouvons utiliser certaines technologies et bibliothèques pour réaliser cette fonction. Cet article présentera comment implémenter l'encodage et le décodage chinois dans un logiciel de programmation en langage C. Premièrement, pour mettre en œuvre l’encodage et le décodage chinois, nous devons comprendre les concepts de base de l’encodage chinois. Actuellement, le système de codage chinois le plus couramment utilisé est le codage Unicode. Le codage Unicode attribue une valeur numérique unique à chaque caractère afin que lors du calcul

See all articles