LeetCode热题(JS版) - 394. 字符串解码

205 阅读2分钟

问题描述

给定一个编码字符串,其中数字表示其后面紧随的一段字符串需要被重复的次数。

  • 例如,输入字符串 3[a]2[bc] 应输出 aaabcbc
  • 另外,可以嵌套使用多个括号,也就是说,输入字符串中可能包含如下子串:3[a2[c]],这个例子应当输出 accaccacc

解法思路

我们可以通过栈来实现对于嵌套结构的解析,具体来说,我们维护两个栈,分别用于处理数字以及字符串。遍历输入字符串:

  • 当遇到数字时,将其转化并压入数字栈中;
  • 当遇到左括号时,将当前字符串压入字符串栈中,并将当前字符串清空;
  • 当遇到右括号时,取出数字栈的顶部元素作为重复次数,对于当前字符串进行重复操作,并弹出字符串栈的顶部元素,将得到的结果再次压入栈中。

Typescript 代码实现

function decodeString(s: string): string {
    let numStack: number[] = []; // 数字栈
    let strStack: string[] = []; // 字符串栈
    let num: number = 0; // 当前数字
    let str: string = ''; // 当前字符串

    for (let i: number = 0; i < s.length; i++) {
        if (!isNaN(Number(s[i]))) { // 数字情况
            num = num * 10 + Number(s[i]); // 处理多位数字的情况
        } else if (s[i] === '[') { // 左括号情况
            numStack.push(num);
            strStack.push(str);
            num = 0; // 重置当前数字
            str = ''; // 重置当前字符串
        } else if (s[i] === ']') { // 右括号情况
            let repeatTimes: number = numStack.pop()!; // 取出数字栈顶元素作为重复次数
            let prevStr: string = strStack.pop()!;
            str = prevStr + str.repeat(repeatTimes); // 进行字符串的构造与拼接
        } else { // 普通字符情况
            str += s[i];
        }
    }

    return str;
};

image.png

复杂度分析

  • 空间复杂度为 O(n)O(n)。该解法中使用了两个栈来辅助处理。
  • 时间复杂度为 O(n)O(n),由于我们需要遍历整个字符串,并对于每个字符进行一系列操作