Decode a Bracketed Repetition String
Problem
Expand strings of the form k[chunk], where k is a positive integer count and chunk is itself an arbitrarily nested encoding. Use a stack of (count, partial string) frames; on '[' push, on ']' pop and repeat.
Input
s = "2[a3[b]]"Output
"abbbabbb"Inner 3[b] expands to "bbb"; then 2[abbb] expands to "abbbabbb".
def decode(s):
stack = []
cur = ""
num = 0
for c in s:
if c.isdigit(): num = num * 10 + int(c)
elif c == '[': stack.append((num, cur)); num = 0; cur = ""
elif c == ']': k, prev = stack.pop(); cur = prev + cur * k
else: cur += c
return cur
function decode(s) {
const stack = []; let cur = "", num = 0;
for (const c of s) {
if (/\d/.test(c)) num = num * 10 + Number(c);
else if (c === '[') { stack.push([num, cur]); num = 0; cur = ""; }
else if (c === ']') { const [k, prev] = stack.pop(); cur = prev + cur.repeat(k); }
else cur += c;
}
return cur;
}
class Solution {
public String decode(String s) {
Deque<Object[]> stack = new ArrayDeque<>();
StringBuilder cur = new StringBuilder();
int num = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) num = num * 10 + (c - '0');
else if (c == '[') { stack.push(new Object[]{ num, cur }); num = 0; cur = new StringBuilder(); }
else if (c == ']') { Object[] f = stack.pop(); int k = (int) f[0]; StringBuilder prev = (StringBuilder) f[1]; StringBuilder rep = new StringBuilder(); for (int i = 0; i < k; i++) rep.append(cur); cur = prev.append(rep); }
else cur.append(c);
}
return cur.toString();
}
}
string decode(string s) {
stack<pair<int, string>> st;
string cur = "";
int num = 0;
for (char c : s) {
if (isdigit(c)) num = num * 10 + (c - '0');
else if (c == '[') { st.push({ num, cur }); num = 0; cur = ""; }
else if (c == ']') { auto [k, prev] = st.top(); st.pop(); string rep; for (int i = 0; i < k; i++) rep += cur; cur = prev + rep; }
else cur += c;
}
return cur;
}