[路飞] 字符串解码

65 阅读1分钟

记录 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]
    }