题目

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

编码规则为: 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”

repeat 方法 会重复连接字符串返回一个新的字符串

思路:

  • 准备string栈
  • 准备number栈
  • 准备拼接的string:everyString
  • 循环遍历s,遇到 ‘[‘ 之前可能会遇到几个数或者几个字母
  • 数字需要*10进行相加,因为可能遇到’24’这样的。
  • 字符串进行进行拼接
  • 当遇到了’[‘符号之后,就将拼接的字符串和准备好的number放进对应的栈中
  • 等遇到了’]’符号之后,就可以将栈的拿出来,进行链接处理了
    1. const decodeString = (s) => {
    2. let numArray = []; // 出现的 num 进行记录
    3. let everyString = '' // '[' 符号之后每一个的每一个英文字母 到 ']' 生成一组等待拼接的字符串
    4. const stringArray = []; // 将每一组字符串放进来 跟 numArray 正好对应上
    5. let num = 0
    6. for (let char of s) {
    7. if (!isNaN(char)) {
    8. // '[' 左边可能有number记录
    9. // '24' 这种number需要 2*10 + 4
    10. num = num * 10 + Number(char)
    11. } else if (char === '[') {
    12. // 当遇到字符 '[' 说明可以往栈里添加字符串和 number 了
    13. stringArray.push(everyString)
    14. everyString = ''
    15. numArray.push(num)
    16. num = 0
    17. } else if (char === ']') {
    18. // 遇到 ']' 说明可以对栈里现有的进行处理了
    19. const num = numArray.pop()
    20. everyString = stringArray.pop() + everyString.repeat(num)
    21. } else {
    22. // '[' 左边可能有字母 组合这个字母
    23. everyString += char
    24. }
    25. }
    26. return everyString
    27. };
    28. const str = decodeString("2[abc]3[cd]ef")
    29. console.log(str);