题目如下图:
解题代码如下:
function smartRepeat (templateStr) {
// 指针
var index = 0
// 栈1,存放数字
var stack1 = []
// 栈2,存放临时字符串
var stack2 = []
// 剩余部分
var rest = templateStr
while (index < templateStr.length - 1) {
// 剩余部分
rest = templateStr.substring(index)
// console.log(rest)
// 看当前剩余部分是不是以数字开头
if (/^\d+\[/.test(rest)) {
// 得到这个数字
let times = Number(rest.match(/(^\d+)\[/)[1])
// 指针后移,times 这个数字是多少位,就后移多少位加 1 位,
// 为什么要加 1 ?加的1 位是为了跨过 [ 符号
index += times.toString().length + 1
// 把数字压栈,空字符串压栈
stack1.push(times)
stack2.push('')
} else if (/^\w+\]/.test(rest)) {
// 如果这个字符是字母,那么此时就把栈顶这项改为这个字母
let word = rest.match(/^(\w+)\]/)[1]
stack2[stack2.length - 1] = word
// 让指针后移,word 这个词语是多少位就后移多少位
index += word.length
} else if (rest[0] === ']') {
// 如果这个字符是 ] 那么就分三步做
// ①将 stack1 弹栈 ② stack2 弹栈,③ 把字符串栈的最栈顶的元素重复刚刚弹出的那个字符串,对应的指定次数并拼接到新栈顶上
let times = stack1.pop()
let word = stack2.pop()
// repeat 是 es6 的方法,比如 'a'.repeat(3) 得到 'aaa'
stack2[stack2.length - 1] += word.repeat(times)
index++
}
// console.log(index, stack1, stack2)
}
// while 结束之后, stack1 和 stack2 中肯定还剩余 1 项。返回栈2中剩下的这一项,重复栈1中剩下的这一项的次数,组中的这个字符串。
// 如果剩的个数不对,那就是用户的问题,方括号没有闭合
return stack2[0].repeat(stack1[0])
}
let newStr = smartRepeat('3[2[abc]2[d]]')
console.log(newStr) // abcabcddabcabcddabcabcdd