给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:
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)