Welcome to Subscribe On Youtube
394. Decode String
Description
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"
Constraints:
1 <= s.length <= 30
s
consists of lowercase English letters, digits, and square brackets'[]'
.s
is guaranteed to be a valid input.- All the integers in
s
are in the range[1, 300]
.
Solutions
A recursive approach or using a stack are common solutions to this problem. I will provide a solution using a stack here:
- A stack is used to keep track of the strings and numbers.
- When a digit is encountered, it is accumulated in
current_num
. - On encountering ‘[’, the current context (current string and number) is saved onto the stack, and the current string and number are reset for a new context.
- On encountering ‘]’, a previous context is popped from the stack, and the current string is updated by repeating it according to the popped number, then concatenating with the popped string.
- If a non-digit, non-bracket character is encountered, it is added to the current string.
- Finally, the
current_string
holds the decoded string.
Walk through the example s = "3[a2[bc]]"
-
Initialization:
num_stk = []
,str_stk = []
,num = 0
,res = ''
. - Parsing
s
:'3'
:num
becomes3
.'['
: Push3
intonum_stk
and''
intostr_stk
. Resetnum
andres
.'a'
:res
becomes'a'
.'2'
:num
becomes2
.'['
: Push2
intonum_stk
and'a'
intostr_stk
. Resetnum
andres
.'b'
and'c'
:res
becomes'bc'
.']'
: Pop2
fromnum_stk
and'a'
fromstr_stk
. Setres
to'a' + 'bc' * 2
, which is'abcbc'
.']'
again: Pop3
fromnum_stk
and''
(initial value) fromstr_stk
. Setres
to'' + 'abcbc' * 3
, which is'abcbcabcbcabcbc'
.
- Completion: No more characters in
s
.res = 'abcbcabcbcabcbc'
is the final result.
-
class Solution { public String decodeString(String s) { Deque<Integer> s1 = new ArrayDeque<>(); Deque<String> s2 = new ArrayDeque<>(); int num = 0; String res = ""; for (char c : s.toCharArray()) { if ('0' <= c && c <= '9') { num = num * 10 + c - '0'; } else if (c == '[') { s1.push(num); s2.push(res); num = 0; res = ""; } else if (c == ']') { StringBuilder t = new StringBuilder(); for (int i = 0, n = s1.pop(); i < n; ++i) { t.append(res); } res = s2.pop() + t.toString(); } else { res += String.valueOf(c); } } return res; } }
-
class Solution: def decodeString(self, s: str) -> str: num_stk, str_stk = [], [] num, res = 0, '' for c in s: if c.isdigit(): num = num * 10 + int(c) elif c == '[': num_stk.append(num) str_stk.append(res) # initial, res being pushed is empty str '' num, res = 0, '' elif c == ']': res = str_stk.pop() + res * num_stk.pop() else: res += c return res
-
function decodeString(s: string): string { let ans = ''; let stack = []; let count = 0; // repeatCount for (let cur of s) { if (/[0-9]/.test(cur)) { count = count * 10 + Number(cur); } else if (/[a-z]/.test(cur)) { ans += cur; } else if ('[' == cur) { stack.push([ans, count]); // reset ans = ''; count = 0; } else { // match ']' let [pre, count] = stack.pop(); ans = pre + ans.repeat(count); } } return ans; }