题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
基础知识:
- “abc”.repeat(2) // “abcabc”
思路:
- 准备string栈
- 准备number栈
- 准备拼接的string:everyString
- 循环遍历s,遇到 ‘[‘ 之前可能会遇到几个数或者几个字母
- 数字需要*10进行相加,因为可能遇到’24’这样的。
- 字符串进行进行拼接
- 当遇到了’[‘符号之后,就将拼接的字符串和准备好的number放进对应的栈中
- 等遇到了’]’符号之后,就可以将栈的拿出来,进行链接处理了
const decodeString = (s) => {let numArray = []; // 出现的 num 进行记录let everyString = '' // '[' 符号之后每一个的每一个英文字母 到 ']' 生成一组等待拼接的字符串const stringArray = []; // 将每一组字符串放进来 跟 numArray 正好对应上let num = 0for (let char of s) {if (!isNaN(char)) {// '[' 左边可能有number记录// '24' 这种number需要 2*10 + 4num = num * 10 + Number(char)} else if (char === '[') {// 当遇到字符 '[' 说明可以往栈里添加字符串和 number 了stringArray.push(everyString)everyString = ''numArray.push(num)num = 0} else if (char === ']') {// 遇到 ']' 说明可以对栈里现有的进行处理了const num = numArray.pop()everyString = stringArray.pop() + everyString.repeat(num)} else {// '[' 左边可能有字母 组合这个字母everyString += char}}return everyString};const str = decodeString("2[abc]3[cd]ef")console.log(str);
