给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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"
这道题和成对的括号我用的是一样的思路。
-
nums记录遇到的数字,num记录上一个数字,stack记录被[]分割开的字符串,idx记录当前属于第几个[]
-
先进行区分,【,】,数字,字母
-
遇到【,则说明前面必有num,将其加入到nums中。idx++,将stack中idx下标设为字符串
-
遇到】,表示当前的括号结束,idx—,取出最末位的stack和nums。将stack中的前一位加上当前位重复当前位的num次数。
-
遇到数字,记录数字,连续遇到数字,计算倍数。
-
遇到字符串,将字符串加入当前位的stack中。
var decodeString = function (s) { let nums = [] let num = 0 let stack = [""] let idx = 0 for (let i = 0; i < s.length; i++) { if (s[i] == "[") { nums.push(num) num = 0; idx++ stack[idx] = "" } else if (s[i] == "]") { idx-- let popS = stack.pop() let popN = nums.pop() while (popN > 0) { stack[idx] = stack[idx] + popS popN-- } } else if (!isNaN(s[i])) { num = num * 10 + Number(s[i]); // 算出倍数 } else { stack[idx] = stack[idx] + (s[i]) } } return stack[0] };