/**
 * @param {string} s
 * @return {string}
 */

//First attempt iterative while loop. Doesn't work with nested brackets and multipliers like '3[a2[c]]'
// var decodeString = function(str) {
//   let i = 0,
//     charCode,
//     decoded = '',
//     multiplier,
//     substr
//   const len = str.length
//   while (i < len) {
//     charCode = str.charCodeAt(i)
//     if (charCode >= 97 && charCode <= 122) {
//       decoded += str[i]
//       i++
//       continue
//     } else if (charCode >= 48 && charCode <= 57) {
//       multiplier = str[i]
//       i++
//       while (charCode !== 91) {
//         charCode = str.charCodeAt(i)
//         if (charCode !== 91) {
//           multiplier += str[i]
//         }
//         i++
//       }
//       substr = ''
//       while (charCode !== 93) {
//         charCode = str.charCodeAt(i)
//         if (charCode !== 93) {
//           substr += str[i]
//         }
//         i++
//       }

//       multiplier = parseInt(multiplier)
//       while (multiplier > 0) {
//         decoded += substr
//         multiplier--
//       }
//     }
//   }
//   return decoded
// }

//Second Attempt with Stack
function decodeString(str) {
	const stack = []
	let subStr = '',
		multiplier = ''
	for (curr of str) {
		if (curr === '[') {
			stack.push(subStr)
			stack.push(parseInt(multiplier))
			multiplier = ''
			subStr = ''
		} else if (curr === ']') {
			multiplier = stack.pop()
			const prevStr = stack.pop()
			subStr = prevStr + subStr.repeat(multiplier)
			multiplier = ''
		} else if (Number.isInteger(parseInt(curr))) {
			multiplier += curr
		} else {
			subStr += curr
		}
	}

	return subStr
}

//Test cases
console.log(decodeString('2[aa]3[bc]ef'))
console.log(decodeString('can3[abn2[cc]]'))
console.log(decodeString('adfdb'))
console.log(decodeString(''))
console.log(decodeString('2[]dfsd'))
console.log(decodeString('2[a]3[b]4[c]5[d]'))
console.log(decodeString('0[ad]fd1[b]'))