Table of Contents
Example
method 1
algorithm
Output
Method 2
示例
输出
Home Backend Development C++ Recursively decode a string encoded as a count followed by a substring

Recursively decode a string encoded as a count followed by a substring

Sep 09, 2023 pm 01:53 PM
coding recursion decoding

Recursively decode a string encoded as a count followed by a substring

In this problem, we need to decode the given string by repeatedly adding the total count number of times.

We can approach the problem in three different ways, and we can use two stacks or one stack to solve the problem. Also, we can solve the problem without using two stacks.

Problem Statement - We are given a string str containing left and right brackets, alpha and numeric characters. We need to decode the string recursively.

The following are patterns or rules for decoding strings.

  • [chars] - "chars" should appear count times in the result string.

Example

enter

str = "2[d]3[c2[n]]";
Copy after login

Output

ddcnncnncnn
Copy after login

illustrate

  • First, we decode 2[n] and get "2[d]3[cnn]".

  • Next, we decode 3[cnn]. So, we get "2[d]cnnncnncnn".

  • Next, we decode 2[d]. So, we get "ddcnnncnncnn".

enter

5[i]
Copy after login

Output

iiiii
Copy after login

Explanation- When we decode the given string, we get 5 "I"s.

enter

3[fg]
Copy after login

Output

fgfgfg
Copy after login

Explanation- When we decode the input string, we get "fg" 3 times.

method 1

We will use two stacks to solve the problem in this method. When we get an opening parenthesis, we push it onto the stack. Additionally, when we get numeric characters, we append all numeric characters to a valid positive integer and add them to the integer stack. Afterwards, when we get the closing bracket, we pop the integer and character from the stack.

algorithm

Step 1- Define the "instSt" stack to store numbers and "strSt" to store string characters and left brackets. Additionally, "answer" is initialized to store the result string and "tempStr" is initialized to store the temporary string.

Step 2- Start traversing the string.

Step 3 - If the current character is a number, initialize "num" with 0 to store the number.

Step 3.1 − If the character at the pthth index is a number, traverse the string until you get an alphabetic character or a bracket. Within the loop, multiply the previous value of "num" by 10 and add the current number to it.

Step 3.2− Increase the value of "p" by 1.

Step 3.3 - Push the numeric value to the "instSt" stack.

Step 4 - If the character at the pth index is a right bracket, follow these steps.

Step 4.1- Initialize "temp_str" with an empty string. Afterwards, if 'instSt' is not empty, pop the top integer from the stack.

Step 4.2 - Now, use a loop until we get the left bracket or the stack becomes empty from the "strSt" stack. Also, append characters to "temp_str".

Step 4.3 - If we stopped pooping the character due to "[", remove it.

Step 4.4 - Next, we need to append "temp_Str" "num" times to the "answer" string.

Step 4.5 - Insert each character of the "answer" string into the "strSt" stack and reinitialize it with an empty string.

Step 5 − If the current character is a left bracket, please follow the steps below.

Step 5.1 − If the previous character is a number, push "[" onto the stack "StrSt". Otherwise, push '[' onto the StrSt stack and push 1 onto the 'instSt' stack.

Step 6− If we get an alphabetic character, push it onto the "strSt" stack.

Step 7 - Finally, use a loop to remove all characters from the "strSt" stack, append to the "answer" string, and return it.

Example

#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;
}
Copy after login

Output

The resultant string after decoding it is - ddcnncnncnn
Copy after login

Time complexity− O(n^2), because we iterate over the string and keep pushing and popping elements to the stack.

Space Complexity− O(n) to store elements in the stack.

Method 2

We will solve the problem without using stack in this method. Additionally, we will use the reverse() method to reverse the string.

algorithm

Step 1- Start iterating the string.

Step 2− If the i-th character is "]", push it into the "answer" string. Otherwise, follow the steps below.

Step 3 - Initialize "temp_Str" with an empty string.

Step 4 - Continue iterating through the "answer" string until the string is empty or the "[" character is found. Also, continue popping the last character from the "answer" string and appending it to the "temp_Str" string.

Step 5 - Reverse the "temp_Str" string as we traverse backward from where we found the "]" bracket.

Step 6 - Remove the last character from the "answer" string to remove the "[" character.

第 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;
}
Copy after login

输出

The resultant string after decoding it is − ddcnncnncnn
Copy after login

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

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

The above is the detailed content of Recursively decode a string encoded as a count followed by a substring. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Recursive implementation of C++ functions: Is there a limit to recursion depth? Recursive implementation of C++ functions: Is there a limit to recursion depth? Apr 23, 2024 am 09:30 AM

The recursion depth of C++ functions is limited, and exceeding this limit will result in a stack overflow error. The limit value varies between systems and compilers, but is usually between 1,000 and 10,000. Solutions include: 1. Tail recursion optimization; 2. Tail call; 3. Iterative implementation.

Do C++ lambda expressions support recursion? Do C++ lambda expressions support recursion? Apr 17, 2024 pm 09:06 PM

Yes, C++ Lambda expressions can support recursion by using std::function: Use std::function to capture a reference to a Lambda expression. With a captured reference, a Lambda expression can call itself recursively.

Count the number of occurrences of a substring recursively in Java Count the number of occurrences of a substring recursively in Java Sep 17, 2023 pm 07:49 PM

Given two strings str_1 and str_2. The goal is to count the number of occurrences of substring str2 in string str1 using a recursive procedure. A recursive function is a function that calls itself within its definition. If str1 is "Iknowthatyouknowthatiknow" and str2 is "know" the number of occurrences is -3. Let us understand through examples. For example, input str1="TPisTPareTPamTP", str2="TP"; output Countofoccurrencesofasubstringrecursi

Recursive implementation of C++ functions: Comparative analysis of recursive and non-recursive algorithms? Recursive implementation of C++ functions: Comparative analysis of recursive and non-recursive algorithms? Apr 22, 2024 pm 03:18 PM

The recursive algorithm solves structured problems through function self-calling. The advantage is that it is simple and easy to understand, but the disadvantage is that it is less efficient and may cause stack overflow. The non-recursive algorithm avoids recursion by explicitly managing the stack data structure. The advantage is that it is more efficient and avoids the stack. Overflow, the disadvantage is that the code may be more complex. The choice of recursive or non-recursive depends on the problem and the specific constraints of the implementation.

Knowledge graph: the ideal partner for large models Knowledge graph: the ideal partner for large models Jan 29, 2024 am 09:21 AM

Large language models (LLMs) have the ability to generate smooth and coherent text, bringing new prospects to areas such as artificial intelligence conversation and creative writing. However, LLM also has some key limitations. First, their knowledge is limited to patterns recognized from training data, lacking a true understanding of the world. Second, reasoning skills are limited and cannot make logical inferences or fuse facts from multiple data sources. When faced with more complex and open-ended questions, LLM's answers may become absurd or contradictory, known as "illusions." Therefore, although LLM is very useful in some aspects, it still has certain limitations when dealing with complex problems and real-world situations. In order to bridge these gaps, retrieval-augmented generation (RAG) systems have emerged in recent years. The core idea is

Detailed explanation of C++ function recursion: application of recursion in string processing Detailed explanation of C++ function recursion: application of recursion in string processing Apr 30, 2024 am 10:30 AM

A recursive function is a technique that calls itself repeatedly to solve a problem in string processing. It requires a termination condition to prevent infinite recursion. Recursion is widely used in operations such as string reversal and palindrome checking.

Several common encoding methods Several common encoding methods Oct 24, 2023 am 10:09 AM

Common encoding methods include ASCII encoding, Unicode encoding, UTF-8 encoding, UTF-16 encoding, GBK encoding, etc. Detailed introduction: 1. ASCII encoding is the earliest character encoding standard, using 7-bit binary numbers to represent 128 characters, including English letters, numbers, punctuation marks, control characters, etc.; 2. Unicode encoding is a method used to represent all characters in the world The standard encoding method of characters, which assigns a unique digital code point to each character; 3. UTF-8 encoding, etc.

How to implement encoding and decoding of Chinese characters in C language programming? How to implement encoding and decoding of Chinese characters in C language programming? Feb 19, 2024 pm 02:15 PM

In modern computer programming, C language is one of the most commonly used programming languages. Although the C language itself does not directly support Chinese encoding and decoding, we can use some technologies and libraries to achieve this function. This article will introduce how to implement Chinese encoding and decoding in C language programming software. First, to implement Chinese encoding and decoding, we need to understand the basic concepts of Chinese encoding. Currently, the most commonly used Chinese encoding scheme is Unicode encoding. Unicode encoding assigns a unique numeric value to each character so that when calculating

See all articles