71.字符串解码

2 阅读1分钟

题目链接

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

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

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

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

解法 栈辅助

思路

在构造字符串的时候一共有 4 种情况需要处理:

  • 第一种就是正常的字符,既不是左右括号又不是数字,这种直接添加就好
  • 第二种就是数字,此时我们需要保存这个数字,因为可能出现十位或者百位
  • 第三种就是左括号,此时我们需要将此前的字符串和数字都要入栈,因为有可能出现嵌套的情况。比如 3[a4[b5[a]]]
  • 第四种就是右括号,此时要还原字符串,要将之前入栈的字符串和现在的字符串和重复次数拼接起来

这上述的情况需要两个栈来辅助,一个用来保存字符一个用来保存数字。

代码

function decodeString(s: string): string {
    const strStk = [];
    const countStk = [];
    let currentStr = "";
    let currentNum = 0;

    for (let char of s) {
        if (!isNaN(Number(char))) {
            currentNum = currentNum * 10 + Number(char);
        } else if (char === "[") {
            countStk.push(currentNum);
            strStk.push(currentStr);
            currentNum = 0;
            currentStr = "";
        } else if (char === "]") {
            const repeatTimes = countStk.pop();
            const prevStr = strStk.pop();
            currentStr = prevStr + currentStr.repeat(repeatTimes);
        } else {
            currentStr += char;
        }
    }
    return currentStr;
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(n)