394. Decode String

133 阅读1分钟

394. Decode String

解题思路

  1. 数字的处理 32[abc3[b]] 循环这个的时候遇到连续的数字 需要做累加操作 curNum = curNum * 10 + Number(char)
  2. 当遇到 [ 时 需要将 preString 即 累加的字符 curString = '' 先入栈,数字 curNum = 32 后入栈
  3. 当遇到字母时累加字母
  4. 当遇到 ’]‘ 需要出栈 num preString

例子 32[abc3[b]]的步骤

  1. 3 curNum = 3
  2. 2 curNum = 3 * 10 + 2
  3. [ 入栈 stack = ['', 32];重置 curSring = '' curNum = 0
  4. abc curString = 'abc'
  5. 3 curNum = 3
  6. [ 入栈 stack = ['', 32, 'abc', 3];重置 curSring = '' curNum = 0
  7. b curString = 'b'
  8. ] 出栈 num = 3 preString = 'abc'; curString = 'abc' + multi(3, 'b') curString = 'abcbbb'
  9. ] 出栈 num = 32 preString = ''; curString = '' + multi(32, 'abcbbb') 返回 curString 即可

代码

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


const decodeString = function (s) {

    const stack = []
    let curNum = 0
    let curString = ''
    let isNumber = (a) => {
        return !Number.isNaN(Number(a))
    }
    let multStr = (num, str) => {
        let s = '';
        while(num !== 0) {
            num--
            s += str
        }
        return s
    }
    for(let char of s) {
        if(char === '[') {
            stack.push(curString)
            stack.push(curNum)
            curString = ''
            curNum = 0
        } else if (char === ']') {
            const num = stack.pop()
            const preString = stack.pop()
            curString = preString + multStr(num, curString)
        } else if(isNumber(char)) {
            curNum = curNum * 10 + Number(char)
        } else {
            curString += char
        }
    }
  
    return curString
}