An encoded string (s) is given, the task is to decode it. The pattern in which the strings are encoded is as follows.
<count>[sub_str] ==> The substring 'sub_str'
appears count times.
Examples:
Input : str[] = "1[b]"
Output : b
Input : str[] = "2[ab]"
Output : abab
Input : str[] = "2[a2[b]]"
Output : abbabb
Input : str[] = "3[b2[ca]]"
Output : bcacabcacabcaca
The idea is to use two stacks, one for integers and another for characters.
Now, traverse the string,
- Whenever we encounter any number, push it into the integer stack and in case of any alphabet (a to z) or open bracket (‘[‘), push it onto the character stack.
- Whenever any close bracket (‘]’) is encounter pop the character from the character stack until open bracket (‘[‘) is not found in the character stack. Also, pop the top element from the integer stack, say n. Now make a string repeating the popped character n number of time. Now, push all character of the string in the stack.

Below is the implementation of this approach:
C++
#include<bits/stdc++.h>
using namespace std;
string decode(string str)
{
stack< int > integerstack;
stack< char > stringstack;
string temp = "" , result = "" ;
for ( int i = 0; i < str.length(); i++)
{
int count = 0;
if (str[i] >= '0' && str[i] <= '9' )
{
while (str[i] >= '0' && str[i] <= '9' )
{
count = count * 10 + str[i] - '0' ;
i++;
}
i--;
integerstack.push(count);
}
else if (str[i] == ']' )
{
temp = "" ;
count = 0;
if (! integerstack.empty())
{
count = integerstack.top();
integerstack.pop();
}
while (! stringstack.empty() && stringstack.top()!= '[' )
{
temp = stringstack.top() + temp;
stringstack.pop();
}
if (! stringstack.empty() && stringstack.top() == '[' )
stringstack.pop();
for ( int j = 0; j < count; j++)
result = result + temp;
for ( int j = 0; j < result.length(); j++)
stringstack.push(result[j]);
result = "" ;
}
else if (str[i] == '[' )
{
if (str[i-1] >= '0' && str[i-1] <= '9' )
stringstack.push(str[i]);
else
{
stringstack.push(str[i]);
integerstack.push(1);
}
}
else
stringstack.push(str[i]);
}
while (! stringstack.empty())
{
result = stringstack.top() + result;
stringstack.pop();
}
return result;
}
int main()
{
string str = "3[b2[ca]]" ;
cout << decode(str) << endl;
return 0;
}
|
Java
import java.util.Stack;
class Test
{
static String decode(String str)
{
Stack<Integer> integerstack = new Stack<>();
Stack<Character> stringstack = new Stack<>();
String temp = "" , result = "" ;
for ( int i = 0 ; i < str.length(); i++)
{
int count = 0 ;
if (Character.isDigit(str.charAt(i)))
{
while (Character.isDigit(str.charAt(i)))
{
count = count * 10 + str.charAt(i) - '0' ;
i++;
}
i--;
integerstack.push(count);
}
else if (str.charAt(i) == ']' )
{
temp = "" ;
count = 0 ;
if (!integerstack.isEmpty())
{
count = integerstack.peek();
integerstack.pop();
}
while (!stringstack.isEmpty() && stringstack.peek()!= '[' )
{
temp = stringstack.peek() + temp;
stringstack.pop();
}
if (!stringstack.empty() && stringstack.peek() == '[' )
stringstack.pop();
for ( int j = 0 ; j < count; j++)
result = result + temp;
for ( int j = 0 ; j < result.length(); j++)
stringstack.push(result.charAt(j));
result = "" ;
}
else if (str.charAt(i) == '[' )
{
if (Character.isDigit(str.charAt(i- 1 )))
stringstack.push(str.charAt(i));
else
{
stringstack.push(str.charAt(i));
integerstack.push( 1 );
}
}
else
stringstack.push(str.charAt(i));
}
while (!stringstack.isEmpty())
{
result = stringstack.peek() + result;
stringstack.pop();
}
return result;
}
public static void main(String args[])
{
String str = "3[b2[ca]]" ;
System.out.println(decode(str));
}
}
|
Python3
def decode( Str ):
integerstack = []
stringstack = []
temp = ""
result = ""
i = 0
while i < len ( Str ):
count = 0
if ( Str [i] > = '0' and Str [i] < = '9' ):
while ( Str [i] > = '0' and Str [i] < = '9' ):
count = count * 10 + ord ( Str [i]) - ord ( '0' )
i + = 1
i - = 1
integerstack.append(count)
elif ( Str [i] = = ']' ):
temp = ""
count = 0
if ( len (integerstack) ! = 0 ):
count = integerstack[ - 1 ]
integerstack.pop()
while ( len (stringstack) ! = 0 and stringstack[ - 1 ] ! = '[' ):
temp = stringstack[ - 1 ] + temp
stringstack.pop()
if ( len (stringstack) ! = 0 and stringstack[ - 1 ] = = '[' ):
stringstack.pop()
for j in range (count):
result = result + temp
for j in range ( len (result)):
stringstack.append(result[j])
result = ""
elif ( Str [i] = = '[' ):
if ( Str [i - 1 ] > = '0' and Str [i - 1 ] < = '9' ):
stringstack.append( Str [i])
else :
stringstack.append( Str [i])
integerstack.append( 1 )
else :
stringstack.append( Str [i])
i + = 1
while len (stringstack) ! = 0 :
result = stringstack[ - 1 ] + result
stringstack.pop()
return result
if __name__ = = '__main__' :
Str = "3[b2[ca]]"
print (decode( Str ))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public static string decode( string str)
{
Stack< int > integerstack = new Stack< int >();
Stack< char > stringstack = new Stack< char >();
string temp = "" , result = "" ;
for ( int i = 0; i < str.Length; i++)
{
int count = 0;
if ( char .IsDigit(str[i]))
{
while ( char .IsDigit(str[i]))
{
count = count * 10 + str[i] - '0' ;
i++;
}
i--;
integerstack.Push(count);
}
else if (str[i] == ']' )
{
temp = "" ;
count = 0;
if (integerstack.Count > 0)
{
count = integerstack.Peek();
integerstack.Pop();
}
while (stringstack.Count > 0 &&
stringstack.Peek() != '[' )
{
temp = stringstack.Peek() + temp;
stringstack.Pop();
}
if (stringstack.Count > 0 &&
stringstack.Peek() == '[' )
{
stringstack.Pop();
}
for ( int j = 0; j < count; j++)
{
result = result + temp;
}
for ( int j = 0; j < result.Length; j++)
{
stringstack.Push(result[j]);
}
result = "" ;
}
else if (str[i] == '[' )
{
if ( char .IsDigit(str[i - 1]))
{
stringstack.Push(str[i]);
}
else
{
stringstack.Push(str[i]);
integerstack.Push(1);
}
}
else
{
stringstack.Push(str[i]);
}
}
while (stringstack.Count > 0)
{
result = stringstack.Peek() + result;
stringstack.Pop();
}
return result;
}
public static void Main( string [] args)
{
string str = "3[b2[ca]]" ;
Console.WriteLine(decode(str));
}
}
|
Javascript
<script>
function decode(str)
{
let integerstack = [];
let stringstack = [];
let temp = "" , result = "" ;
for (let i = 0; i < str.length; i++)
{
let count = 0;
if (str[i] >= '0' && str[i] <= '9' )
{
while (str[i] >= '0' && str[i] <= '9' )
{
count = count * 10 + str[i] - '0' ;
i++;
}
i--;
integerstack.push(count);
}
else if (str[i] == ']' )
{
temp = "" ;
count = 0;
if (integerstack.length > 0)
{
count = integerstack[integerstack.length - 1];
integerstack.pop();
}
while (stringstack.length > 0 &&
stringstack[stringstack.length - 1] != '[' )
{
temp = stringstack[stringstack.length - 1] + temp;
stringstack.pop();
}
if (stringstack.length > 0 &&
stringstack[stringstack.length - 1] == '[' )
{
stringstack.pop();
}
for (let j = 0; j < count; j++)
{
result = result + temp;
}
for (let j = 0; j < result.length; j++)
{
stringstack.push(result[j]);
}
result = "" ;
}
else if (str[i] == '[' )
{
if (str[i - 1] >= '0' && str[i - 1] <= '9' )
{
stringstack.push(str[i]);
}
else
{
stringstack.push(str[i]);
integerstack.push(1);
}
}
else
{
stringstack.push(str[i]);
}
}
while (stringstack.length > 0)
{
result = stringstack[stringstack.length - 1] + result;
stringstack.pop();
}
return result;
}
let str = "3[b2[ca]]" ;
document.write(decode(str));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
<!—-Illustration of above code for “3[b2[ca]]”>

Method 2(Using 1 stack)
Algorithm:
Loop through the characters of the string
If the character is not ']', add it to the stack
If the character is ']':
While top of the stack doesn't contain '[', pop the characters from the stack and store it in a string temp
(Make sure the string isn't in reverse order)
Pop '[' from the stack
While the top of the stack contains a digit, pop it and store it in dig
Concatenate the string temp for dig number of times and store it in a string repeat
Add the string repeat to the stack
Pop all the characters from the stack(also make the string isn't in reverse order)
Below is the implementation of this approach:
C++
#include <iostream>
#include <stack>
using namespace std;
string decodeString(string s)
{
stack< char > st;
for ( int i = 0; i < s.length(); i++) {
if (s[i] == ']' ) {
string temp;
while (!st.empty() && st.top() != '[' ) {
temp = st.top() + temp;
st.pop();
}
st.pop();
string num;
while (!st.empty() && isdigit (st.top())) {
num = st.top() + num;
st.pop();
}
int number = stoi(num);
string repeat;
for ( int j = 0; j < number; j++)
repeat += temp;
for ( char c : repeat)
st.push(c);
}
else
st.push(s[i]);
}
string res;
while (!st.empty()) {
res = st.top() + res;
st.pop();
}
return res;
}
int main()
{
string str = "3[b2[ca]]" ;
cout << decodeString(str);
return 0;
}
|
Java
import java.util.*;
public class Main
{
static String decodeString(String s)
{
Vector<Character> st = new Vector<Character>();
for ( int i = 0 ; i < s.length(); i++)
{
if (s.charAt(i) == ']' )
{
String temp = "" ;
while (st.size() > 0 && st.get(st.size() - 1 ) != '[' )
{
temp = st.get(st.size() - 1 ) + temp;
st.remove(st.size() - 1 );
}
st.remove(st.size() - 1 );
String num = "" ;
while (st.size() > 0 &&
st.get(st.size() - 1 ) >= 48 &&
st.get(st.size() - 1 ) <= 57 )
{
num = st.get(st.size() - 1 ) + num;
st.remove(st.size() - 1 );
}
int number = Integer.parseInt(num);
String repeat = "" ;
for ( int j = 0 ; j < number; j++)
repeat += temp;
for ( int c = 0 ; c < repeat.length(); c++)
st.add(repeat.charAt(c));
}
else
st.add(s.charAt(i));
}
String res = "" ;
while (st.size() > 0 )
{
res = st.get(st.size() - 1 ) + res;
st.remove(st.size() - 1 );
}
return res;
}
public static void main(String[] args) {
String str = "3[b2[ca]]" ;
System.out.print(decodeString(str));
}
}
|
Python3
def decodeString(s):
st = []
for i in range ( len (s)):
if s[i] = = ']' :
temp = ""
while len (st) > 0 and st[ - 1 ] ! = '[' :
temp = st[ - 1 ] + temp
st.pop()
st.pop()
num = ""
while len (st) > 0 and ord (st[ - 1 ]) > = 48 and ord (st[ - 1 ]) < = 57 :
num = st[ - 1 ] + num
st.pop()
number = int (num)
repeat = ""
for j in range (number):
repeat + = temp
for c in range ( len (repeat)):
if len (st) > 0 :
if repeat = = st[ - 1 ]:
break
st.append(repeat)
else :
st.append(s[i])
return st[ 0 ]
Str = "3[b2[ca]]"
print (decodeString( Str ))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static string decodeString( string s)
{
List< char > st = new List< char >();
for ( int i = 0; i < s.Length; i++)
{
if (s[i] == ']' )
{
string temp = "" ;
while (st.Count > 0 && st[st.Count - 1] != '[' )
{
temp = st[st.Count - 1] + temp;
st.RemoveAt(st.Count - 1);
}
st.RemoveAt(st.Count - 1);
string num = "" ;
while (st.Count > 0 &&
st[st.Count - 1] >= 48 &&
st[st.Count - 1] <= 57)
{
num = st[st.Count - 1] + num;
st.RemoveAt(st.Count - 1);
}
int number = int .Parse(num);
string repeat = "" ;
for ( int j = 0; j < number; j++)
repeat += temp;
foreach ( char c in repeat)
st.Add(c);
}
else
st.Add(s[i]);
}
string res = "" ;
while (st.Count > 0)
{
res = st[st.Count - 1] + res;
st.RemoveAt(st.Count - 1);
}
return res;
}
static void Main()
{
string str = "3[b2[ca]]" ;
Console.Write(decodeString(str));
}
}
|
Javascript
<script>
function decodeString(s)
{
let st = [];
for (let i = 0; i < s.length; i++)
{
if (s[i] == ']' ) {
let temp = "" ;
while (st.length > 0 && st[st.length - 1] != '[' )
{
temp = st[st.length - 1] + temp;
st.pop();
}
st.pop();
let num = "" ;
while (st.length > 0 && st[st.length - 1].charCodeAt() >= 48 && st[st.length - 1].charCodeAt() <= 57) {
num = st[st.length - 1] + num;
st.pop();
}
let number = parseInt(num);
let repeat = "" ;
for (let j = 0; j < number; j++)
repeat += temp;
for (let c = 0; c < repeat.length; c++)
st.push(repeat);
}
else
st.push(s[i]);
}
let res = "" ;
while (st.length > 0) {
res = st[st.length - 1] + res;
st.pop();
}
return res;
}
let str = "3[b2[ca]]" ;
document.write(decodeString(str));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 3: Without Stack
The given problem can be solved by traversing the encoded string character by character and maintaining a result string. Whenever a closing bracket is encountered, we can extract the substring enclosed within the corresponding opening bracket, and the number of times it needs to be repeated, and append the resulting string to the current result. We can continue this process until we reach the end of the input string.
Algorithm for better understanding.
- Initialize an empty string to store the decoded output.
- Traverse the input string character by character.
- If the current character is not a closing bracket ‘]’, add it to the output string.
- If the current character is a closing bracket, extract the substring enclosed within the corresponding opening bracket ‘[…]’, and the number of times it needs to be repeated say ‘num’.
- Append the resulting string to the output string num times.
- Repeat steps 3-5 until we reach the end of the input string.
- Return the decoded string.
Below is the implementation of the above idea.
C++
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
string decodeString(string s)
{
string result = "" ;
for ( int i = 0; i < s.length(); i++) {
if (s[i] != ']' ) {
result.push_back(s[i]);
}
else {
string temp = "" ;
while (!result.empty()
&& result.back() != '[' ) {
temp.push_back(result.back());
result.pop_back();
}
reverse(temp.begin(), temp.end());
result.pop_back();
string num = "" ;
while (!result.empty() && result.back() >= '0'
&& result.back() <= '9' ) {
num.push_back(result.back());
result.pop_back();
}
reverse(num.begin(), num.end());
int int_num = stoi(num);
while (int_num--) {
result += temp;
}
}
}
return result;
}
int main()
{
string str = "3[b2[ca]]" ;
cout << decodeString(str);
return 0;
}
|
Java
import java.util.Stack;
public class Main {
static String decodeString(String s) {
StringBuilder result = new StringBuilder();
for ( int i = 0 ; i < s.length(); i++) {
if (s.charAt(i) != ']' ) {
result.append(s.charAt(i));
} else {
StringBuilder temp = new StringBuilder();
while (result.length() > 0 && result.charAt(result.length() - 1 ) != '[' ) {
temp.insert( 0 , result.charAt(result.length() - 1 ));
result.deleteCharAt(result.length() - 1 );
}
result.deleteCharAt(result.length() - 1 );
StringBuilder num = new StringBuilder();
while (result.length() > 0 && Character.isDigit(result.charAt(result.length() - 1 ))) {
num.insert( 0 , result.charAt(result.length() - 1 ));
result.deleteCharAt(result.length() - 1 );
}
int int_num = Integer.parseInt(num.toString());
while (int_num-- > 0 ) {
result.append(temp);
}
}
}
return result.toString();
}
public static void main(String[] args) {
String str = "3[b2[ca]]" ;
System.out.println(decodeString(str));
}
}
|
Python3
def decodeString(s):
result = ""
i = 0
while i < len (s):
if s[i] ! = ']' :
result + = s[i]
else :
temp = ""
while len (result) > 0 and result[ - 1 ] ! = '[' :
temp = result[ - 1 ] + temp
result = result[: - 1 ]
result = result[: - 1 ]
num = ""
while len (result) > 0 and result[ - 1 ].isdigit():
num = result[ - 1 ] + num
result = result[: - 1 ]
int_num = int (num)
while int_num > 0 :
result + = temp
int_num - = 1
i + = 1
return result
str = "3[b2[ca]]"
print (decodeString( str ))
|
C#
using System;
public class GFG {
static string DecodeString( string s)
{
string result = "" ;
for ( int i = 0; i < s.Length; i++) {
if (s[i] != ']' ) {
result += s[i];
}
else {
string temp = "" ;
while (result.Length > 0
&& result[result.Length - 1]
!= '[' ) {
temp = result[result.Length - 1] + temp;
result = result.Substring(
0, result.Length - 1);
}
result = result.Substring(0, result.Length
- 1);
string num = "" ;
while (result.Length > 0
&& Char.IsDigit(
result[result.Length - 1])) {
num = result[result.Length - 1] + num;
result = result.Substring(
0, result.Length - 1);
}
int int_num = int .Parse(num);
for ( int j = 0; j < int_num; j++) {
result += temp;
}
}
}
return result;
}
static void Main()
{
string str = "3[b2[ca]]" ;
Console.WriteLine(DecodeString(str));
}
}
|
Javascript
function decodeString(s) {
let result = "" ;
for (let i = 0; i < s.length; i++) {
if (s[i] !== ']' ) {
result += s[i];
} else {
let temp = "" ;
while (result.length > 0 && result[result.length - 1] !== '[' ) {
temp = result[result.length - 1] + temp;
result = result.slice(0, -1);
}
result = result.slice(0, -1);
let num = "" ;
while (result.length > 0 && !isNaN(result[result.length - 1])) {
num = result[result.length - 1] + num;
result = result.slice(0, -1);
}
let int_num = parseInt(num);
while (int_num--) {
result += temp;
}
}
}
return result;
}
let str = "3[b2[ca]]" ;
console.log(decodeString(str));
|
Time Complexity: O(n), where n is the length of the input string, as we traverse the input string character by character only once.
Auxiliary Space: O(n), as we are creating a temporary string and a number string.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
17 Oct, 2023
Like Article
Save Article