递归解码一个以计数后跟子字符串编码的字符串
在这个问题中,我们需要通过重复添加总计数次数来解码给定的字符串。
我们可以采用三种不同的方法来解决问题,并且可以使用两个堆栈或一个堆栈来解决问题。另外,我们可以在不使用两个堆栈的情况下解决问题。
问题陈述 - 我们给出了一个字符串 str ,其中包含左括号和右括号、字母和数字字符。我们需要递归地解码字符串。
以下是解码字符串的模式或规则。
[chars] - “chars”应该在结果字符串中出现 count 次。
示例
输入
str = "2[d]3[c2[n]]";
输出
ddcnncnncnn
说明
首先,我们解码 2[n],得到“2[d]3[cnn]”。
接下来,我们解码 3[cnn]。所以,我们得到“2[d]cnnncnncnn”。
接下来,我们解码 2[d]。所以,我们得到“ddcnnncnncnn”。
输入
5[i]
输出
iiiii
解释- 当我们解码给定的字符串时,我们得到 5 个“I”。
输入
3[fg]
输出
fgfgfg
解释- 当我们解码输入字符串时,我们得到“fg”3次。
方法 1
我们将使用两个堆栈来解决此方法中的问题。当我们得到一个左括号时,我们将其推入堆栈。此外,当我们获取数字字符时,我们将所有数字字符附加到一个有效的正整数并将它们添加到整数堆栈中。之后,当我们得到右括号时,我们从堆栈中弹出整数和字符。
算法
第 1 步- 定义“instSt”堆栈来存储数字,定义“strSt”来存储字符串字符和左括号。此外,初始化“answer”以存储结果字符串,初始化“tempStr”以存储临时字符串。
第 2 步- 开始遍历字符串。
第 3 步- 如果当前字符是数字,则用 0 初始化“num”以存储数字。
步骤 3.1 − 如果第 pth 索引处的字符是数字,则遍历字符串,直到得到字母字符或括号。在循环中,将“num”的先前值乘以 10,并将当前数字添加到其中。
步骤 3.2− 将“p”的值增加 1。
步骤 3.3 - 将数字值推送到“instSt”堆栈。
步骤 4 - 如果第 p 个索引处的字符是右括号,请按照以下步骤操作。
步骤 4.1- 用空字符串初始化“temp_str”。之后,如果‘instSt’不为空,则从堆栈中弹出顶部整数。
步骤 4.2 - 现在,使用循环,直到我们得到左括号或堆栈从“strSt”堆栈变空。另外,将字符附加到“temp_str”。
步骤 4.3 - 如果我们由于“[”而停止对角色进行大便,请将其删除。
步骤 4.4 - 接下来,我们需要在“answer”字符串中附加“temp_Str”“num”次。
步骤 4.5 - 将“answer”字符串的每个字符插入“strSt”堆栈中,并使用空字符串重新初始化它。
步骤 5 − 如果当前字符是左括号,请按照以下步骤操作。
步骤 5.1 − 如果前一个字符是数字,则将“[”推入堆栈“StrSt”。否则,将“[”压入 StrSt 堆栈,并将 1 压入“instSt”堆栈。
第 6 步− 如果我们得到一个字母字符,则将其推入“strSt”堆栈。
第 7 步- 最后,使用循环从“strSt”堆栈中删除所有字符,附加到“answer”字符串,然后返回它。
示例
#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; }
输出
The resultant string after decoding it is - ddcnncnncnn
时间复杂度− O(n^2),因为我们遍历字符串并不断向堆栈推送和弹出元素。
空间复杂度− 在堆栈中存储元素的 O(n)。
方法2
我们将在这种方法中不使用堆栈来解决问题。另外,我们将使用reverse()方法来反转字符串。
算法
第 1 步- 开始迭代字符串。
第 2 步− 如果第 i 个字符是“]”,则将其推入“answer”字符串。否则,请按照以下步骤操作。
第 3 步- 使用空字符串初始化“temp_Str”。
第 4 步- 继续遍历“answer”字符串,直到该字符串为空或找到“[”字符。另外,继续从“answer”字符串中弹出最后一个字符并将其附加到“temp_Str”字符串中。
第 5 步- 当我们从找到“]”括号的位置向后遍历时,反转“temp_Str”字符串。
第 6 步- 从“answer”字符串中删除最后一个字符以删除“[”字符。
第 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) 来存储数字和临时字符串。
以上是递归解码一个以计数后跟子字符串编码的字符串的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

C++函数的递归深度受到限制,超过该限制会导致栈溢出错误。限制值因系统和编译器而异,通常在1000到10000之间。解决方法包括:1.尾递归优化;2.尾调用;3.迭代实现。

是的,C++Lambda表达式可以通过使用std::function支持递归:使用std::function捕获Lambda表达式的引用。通过捕获的引用,Lambda表达式可以递归调用自身。

给定两个字符串str_1和str_2。目标是使用递归过程计算字符串str1中子字符串str2的出现次数。递归函数是在其定义中调用自身的函数。如果str1是"Iknowthatyouknowthatiknow",str2是"know"出现次数为-3让我们通过示例来理解。例如输入str1="TPisTPareTPamTP",str2="TP";输出Countofoccurrencesofasubstringrecursi

递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。选择递归或非递归取决于问题和实现的具体限制。

大型语言模型(LLM)具有生成流畅和连贯文本的能力,为人工智能的对话、创造性写作等领域带来了新的前景。然而,LLM也存在一些关键局限。首先,它们的知识仅限于从训练数据中识别出的模式,缺乏对世界的真正理解。其次,推理能力有限,不能进行逻辑推理或从多个数据源融合事实。面对更复杂、更开放的问题时,LLM的回答可能变得荒谬或矛盾,被称为“幻觉”。因此,尽管LLM在某些方面非常有用,但在处理复杂问题和真实世界情境时,仍存在一定的局限性。为了弥补这些差距,近年来出现了检索增强生成(RAG)系统,其核心思想是

递归函数是一种在字符串处理中反复调用自身来解决问题的技术。它需要一个终止条件以防止无限递归。递归在字符串反转和回文检查等操作中被广泛使用。

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。详细介绍:1、ASCII编码是最早的字符编码标准,使用7位二进制数表示128个字符,包括英文字母、数字、标点符号以及控制字符等;2、Unicode编码是一种用于表示世界上所有字符的标准编码方式,它为每个字符分配了一个唯一的数字码点;3、UTF-8编码等等。

在现代计算机编程中,C语言是一种非常常用的编程语言之一。尽管C语言本身并不直接支持中文编码和解码,但我们可以使用一些技术和库来实现这一功能。本文将介绍如何在C语言编程软件中实现中文编码和解码。首先,要实现中文编码和解码,我们需要了解中文编码的基本概念。目前,最常用的中文编码方案是Unicode编码。Unicode编码为每个字符分配了一个唯一的数字值,以便在计
