Decode String
Question
Given an encoded string, return its decoded string.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; there are no extra white spaces, square brackets are well-formed, etc. Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there will not be input like 3a or 2[4].
The test cases are generated so that the length of the output will never exceed 105.
Example 1:
Input: s = "3[a]2[bc]"
Output: "aaabcbc"
Example 2:
Input: s = "3[a2[c]]"
Output: "accaccacc"
Example 3:
Input: s = "2[abc]3[cd]ef"
Output: "abcabccdcdcdef"
Solution
Why it's not a good idea to do recursion
Let's consider the following string:
3[a2[c]3[b]]
It might be tempting to do this recursively, so for example:

However, it's hard to know where the scope of subproblem is going to end because we're reading string by string.
So we're reading:
3[a[2c]3...?
How do we know what's $x$ of our recursion $f(x)$. The only way to know is to read through the whole string first to find the matching bracket to limit the scope of $x$.
However this will be very complex.
Intuition
If we looking at this problem, we can actually parse as the string as we go when we first encounter the ]. Let's come back to our example:
3[a2[c]3[b]]
What if we traverse the string 1 by 1:
3
3[
3[a
3[a2
3[a2[
3[a2[c
3[a2[c]
Note that in here, since we encoutered our first ], we know that we can convert the string 2[c] immediately to cc
3
3[
3[a
3[a2
3[a2[
3[a2[c
3[a2[c] -> 3[acc
Keep continue this iteration we have
3
3[
3[a
3[a2
3[a2[
3[a2[c
3[a2[c] -> 3[acc
3[a2[c]3 -> 3[acc3
3[a2[c]3[ -> 3[acc3[
3[a2[c]3[b -> 3[acc3[b
3[a2[c]3[b] -> 3[acc3[b]
Similarly in here, since we encountered ] again, we can then parse this 3[b] -> bbb:
3
3[
3[a
3[a2
3[a2[
3[a2[c
3[a2[c] -> 3[acc
3[a2[c]3 -> 3[acc3
3[a2[c]3[ -> 3[acc3[
3[a2[c]3[b -> 3[acc3[b
3[a2[c]3[b] -> 3[accbbb
3[a2[c]3[b]] -> 3[accbbb]
In here again, we encounter ]. We then convert this string 3[accbbb] -> accbbbaccbbbaccbbb
3
3[
3[a
3[a2
3[a2[
3[a2[c
3[a2[c] -> 3[acc
3[a2[c]3 -> 3[acc3
3[a2[c]3[ -> 3[acc3[
3[a2[c]3[b -> 3[acc3[b
3[a2[c]3[b] -> 3[accbbb
3[a2[c]3[b]] -> accbbbaccbbbaccbbb
Implementation
class App:
def decodeString(self, s: str) -> str:
stack = []
for char in s:
if char == "]":
parsedSubString = self.parseSubstring(stack)
for c in parsedSubString:
stack.append(c)
else:
stack.append(char)
return "".join(stack)
def parseSubstring(self, stack: List[str]) -> str:
parsedSubString = ""
numString = ""
# parse string
while stack:
char = stack.pop()
if char == "[":
break
else:
parsedSubString = char + parsedSubString
# parse integer
while stack:
# Check before pop so we don't accidentally
# Pop out a non digit
char = stack[-1]
if char.isdigit():
numString = char + numString
stack.pop()
else:
break
return int(numString) * parsedSubString
Time complexity: $O(n \times max(k))$
- $n$ is the length of this decode string
- $k$ is the given $k$, because we need to iteratively add $k$ length inside our stack again so it's $O(n \times max(k))$
Space complexity: $O(n \times max(k))$
- Similarly for our space, we need to store this decoded string. This is the length of the decoded string.