「这是我参与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…
解题思路
可以利用栈来处理:
- 通过循环把字符串中的字符依次入栈;
- 遇到数字时将数字拼接起来,因为数组可能有多位;
- 遇到
[
时,把拼接好的数字入栈,同时把[
入栈; - 遇到
]
时,依次出栈并且拼接成新的字符串,直到栈顶是[
为止,再把[
出栈,这时的栈顶元素就是数字 n,n 就是前面拼接的字符串要循环的次数,循环 n 次,每次入栈拼接的字符串; - 其它情况为字符,入栈即可;
- 循环结束后把栈转换成字符串返回即可;
代码实现
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('')
};
复制代码
如有错误欢迎指出,欢迎一起讨论!