问题描述
给定一个编码字符串,其中数字表示其后面紧随的一段字符串需要被重复的次数。
- 例如,输入字符串
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;
};
复杂度分析
- 空间复杂度为 。该解法中使用了两个栈来辅助处理。
- 时间复杂度为 ,由于我们需要遍历整个字符串,并对于每个字符进行一系列操作