记录 1 道算法题
字符串解码
394. 字符串解码 - 力扣(LeetCode) (leetcode-cn.com)
题目说明非常简单,看例子就知道,这是一个用栈收集的过程。递归也可以,递归本质也是一个栈的使用。
输入: s = "3[a]2[bc]"
输出: "aaabcbc"
输入: s = "3[a2[c]]"
输出: "accaccacc"
输入: s = "10[abc]"
输出: "abcabcabcabcabcabcabcabcabcabc"
function decodeString(s) {
// 准备两个数字模拟栈,收集数字和字母.
// 为了不做初始为空的判断,直接写上 ''
const stack = ['']
const stack2 = ['']
// 我们的打算是遇到 [ 的时候进入开辟新的空间,
// 但是数字是在 [ 之前的,举个简单的例子
// 3[a2[c]] 我们在 [ 入栈后,可能会遇到嵌套的数字,所以要提前开一个空间 '', 不然就是做非空判断。
// 这时候会出现一个差异,就是两个栈的栈顶错开了。
// 于是选择用一个临时变量先存着,等 [ 时再将数字推入栈中。
let currentCount = ''
// 两个指针,指向栈顶。
let a = 0
let b = 0
for(let i = 0; i < s.length; i++) {
const str = s[i]
if (/[0-9]/.exec(str)) {
currentCount += str
} else if (/[a-z]/.exec(str)) {
stack2[b] += str
} else if (/\[/.exec(str)) {
stack.push(currentCount)
currentCount = ''
// 开一个空间,准备收集 [ 里面的字母
stack.push('')
a++
b++
} else if (/\]/.exec(str)) {
// 进行出栈,并入前一项,初始化推入 '' 的时候,
// 正好避免的平级时,数组弹光要进行非空判断的问题。
const w = stack2.pop()
const count = stack.pop()
a--
b--
stack2[b] += w.repeat(+count)
}
}
return stack[0]
}