


Décoder de manière récursive une chaîne codée sous forme de nombre suivi d'une 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]]";
Sortie
ddcnncnncnn
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]
Sortie
iiiii
Explication- Lorsque nous décodons la chaîne donnée, nous obtenons 5 "I".
Entrez
3[fg]
Sortie
fgfgfg
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
#includeusing 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; }
Sortie
The resultant string after decoding it is - ddcnncnncnn
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 步- 返回“答案”字符串。
示例
#includeusing 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; }
输出
The resultant string after decoding it is − ddcnncnncnn
时间复杂度− 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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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 ;

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.

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.

É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.

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.

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.

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.

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
