const decodeString = (s) => { s = s.split("") let stack = [], result = [] for (let i = 0; i < s.length; i++) { if (s[i] === "]") { console.log(`s[i]: ${s[i]}`) console.log(stack) let collectList = [] // pop till "[" while (stack.length > 0) { console.log("> collectList") console.log(collectList) // console.log(collectList.reverse()) let curr = stack.pop() console.log(">>> curr") console.log(curr) if (curr === "[") { break; } collectList.push(curr) } console.log("before finding number") console.log(stack) // if (curr === "[") { let numberStr = "" // to find number while (stack.length > 0) { let maybeNumber = stack[stack.length - 1]; console.log("maybeNumber") console.log(maybeNumber) console.log(`isNaN?`) console.log(isNaN(maybeNumber)) // not a number -> break if (isNaN(maybeNumber)) break; numberStr += stack.pop(); // pop only the last guy IS a number console.log("> numberStr") console.log(numberStr) } // console.log("> numberStr") // console.log(numberStr) numberStr = numberStr.split("").reverse().join("") numberStr = parseInt(numberStr) console.log("> numberStr") console.log(numberStr) collectList.reverse() console.log("after reversing collectList") console.log(collectList) while (numberStr > 0) { console.log("pushing ...") console.log(stack) stack.push(collectList.join("")) console.log("result <") console.log(stack) numberStr--; } console.log("collectList") console.log(collectList) // result.push(collectList) // dc syntax } else { stack.push(s[i]) } } return stack.join(""); } let x = // decodeString("3[a]2[bc]") // Output: "aaabcbc" decodeString("100[leetcode]") // decodeString("3[a2[c]]") // "accaccacc" console.log("Res") console.log(x) // // /** // * @param {string} s // * @return {string} // */ // const decodeString = (s) => { // s = s.split(""); // let stack = [], result = null; // console.log(`input: ${s}`); // for (let i = 0; i < s.length; i++) { // if ("]" === s[i]) { // console.log(`HIT! ] at ${i}`) // console.log(s) // stack = popToOpen(stack, stack.length - 1, []) // // result.push() // console.log(">>>>>> final stack returned") // console.log(stack) // } else { // stack.push(s[i]) // } // // } // // console.log("stack") // console.log(stack.join()) // console.log(stack.join("")) // }; // const popToOpen = (stack, popNb, tmp) => { // console.log(`-> popToOpen - popNb - ${popNb} - stack[i] - ${stack[popNb]}`) // // if (0 > popNb) return stack; // // if ("[" === stack[popNb]) { // stack.pop(); // Remove "[" // let multiplier = []; // console.log("KLQWKLJELKJWLJKWQELKJEQWLKJQWELKJLKJWQELJKQWELKJW") // console.log(stack) // // let l = stack.length - 1; // // for (let j = l; j >= 0; j--) { // console.log(`---> in J loop - ${j}`) // // let maybeNb = parseInt(stack[j]); // // because the numebr will never be 0 so we can use parseInt // if (!maybeNb && 0 !== maybeNb) { // console.log("NOT AN INT BYEEE") // console.log(stack[j]) // break; // } // // console.log("stack[j]") // console.log(stack[j]) // multiplier = [...stack[j], ...multiplier]; // stack.pop(); // } // // console.log("---> multiplier") // console.log(multiplier) // console.log(parseInt(multiplier.join())) // console.log("tmp") // console.log(tmp) // // multiplier = parseInt(multiplier.join("")); // // tmp = tmp.join("").repeat(multiplier).split("") // return [...stack, ...tmp]; // } // // // tmp = [stack.pop(), ...[...tmp, stack[i]]]; // console.log("--before tmp") // console.log(tmp) // tmp = [...stack.pop(), ...tmp]; // // console.log("--- AFTER POP") // console.log(stack) // console.log(tmp) // // return popToOpen(stack, popNb - 1, tmp) // } // // // 14 // // decodeString("ww3[aaa2[abac]]2[a]a") // // decodeString("2[asd]3[q]") // // decodeString("2[asdww]") // // decodeString("qq3[w]x") // decodeString("33[w]z") // decodeString("100[leetcode]")