LeetCode HOT 100 —— 394. 字符串解码
辅助栈
中等
题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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"
解题思路
字符串内可能出现 数字
、字母
、[
、]
数字:用于重复次数计算,如果出现连续数字需要处理。
字母:延长字符串
左括号:当前状态入栈
右括号:弹出状态,组合字符串
解题代码
var decodeString = function(s) {
const arr = [] // 栈
let res = '' // 字符串
let multi = 0 // 重复次数
for(let item of s) {
// 判断当前字符是否为数字
if(item < 48 || item > 57) {
// 如果重复次数不为0,说明上一个字符仍是数字
if(multi != 0) {
multi = multi + item
} else {
multi = item
}
} else if(item === '[') {
arr.push([multi, res]) // 将重复次数和字符串组合放入栈内
multi = 0
res = ''
} else if(item === ']') {
const [num, str] = arr.pop() // 弹出状态
res = str + res.repeat(num) // 原字符串和组合后的字符串拼接
} else {
// 字符处理,延长字符串
res = res + item
}
}
return res // 返回结果
};
举例:这里使用 示例 1
这个例子
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
第一个字符为 3
,它是数字,此时 multi = 3, res = ''
第二个字符为 [
,它是左括号,将 [3, '']
压入栈内,此时 multi = 0, res = ''
第三个字符为 a
,它是字母,此时 multi = 0, res = 'a'
第四个字符为 ]
,它是右括号,弹出状态 num = 3, str = ''
,拼接后 multi = 0, res = '' + 'aaa' = 'aaa'
第五个字符为 2
,它是数字,此时 multi = 2, res = 'aaa'
第六个字符为 [
,它是左括号,将 [2, 'aaa']
压入栈内,此时 multi = 0, res = ''
第七个字符为 b
,它是字母,此时 multi = 0, res = 'b'
第八个字符为 c
,它是字母,此时 multi = 0, res = 'bc'
第九个字符为 ]
,它是右括号,弹出状态 num = 2, str = 'aaa'
,拼接后 multi = 0, res = 'aaa' + 'bcbc' = 'aaabcbc'
* 栈内的 num
是下一个res重复的次数,str
是之前已经处理过的字符串