[路飞]_前端算法第九十五弹-字符串解码

167 阅读1分钟

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[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] };