[路飞]_LeetCode_394. 字符串解码

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

题目

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"
复制代码

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"
复制代码

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
复制代码

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
复制代码

来源:力扣(LeetCode)leetcode-cn.com/problems/de…

解题思路

可以利用栈来处理:

  1. 通过循环把字符串中的字符依次入栈;
  2. 遇到数字时将数字拼接起来,因为数组可能有多位;
  3. 遇到 [ 时,把拼接好的数字入栈,同时把 [ 入栈;
  4. 遇到 ] 时,依次出栈并且拼接成新的字符串,直到栈顶是 [ 为止,再把 [ 出栈,这时的栈顶元素就是数字 n,n 就是前面拼接的字符串要循环的次数,循环 n 次,每次入栈拼接的字符串;
  5. 其它情况为字符,入栈即可;
  6. 循环结束后把栈转换成字符串返回即可;

代码实现

var decodeString = function (s) {
    let stack = new Array()
    let num = ''

    for (let c of s) {
        if (!isNaN(Number(c))) {
            //将数组拼接起来
            num += c
        } else if (c === '[') {
            stack.push(Number(num))
            stack.push('[')
            num = ''
        } else if (c === ']') {
            //遇到右括号时,依次出栈字符并且拼接,直到栈顶为左括号
            let str = ''
            while (stack.length && stack[stack.length - 1] !== '[') {
                str = `${stack.pop()}${str}`
            }
            //把左括号出栈
            stack.pop()

            //向栈内增加 count 个字符串
            let count = stack.pop()
            while (count--) stack.push(str)
        } else {
            //其它情况则为字符,一律入栈
            stack.push(c)
        }
    }

    return stack.join('')
};
复制代码

如有错误欢迎指出,欢迎一起讨论!

猜你喜欢

转载自juejin.im/post/7054205489495670798