字符串解码问题
字数 1659 2025-11-19 04:35:59

字符串解码问题

题目描述
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为 k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
输入:s = "3[a2[c]]"
输出:"accaccacc"

解题思路
这个问题需要处理嵌套的括号结构,适合用栈(Stack)来模拟递归过程。核心思路是遍历字符串,遇到数字、字母和括号时分别处理,利用栈暂存当前状态(已解析的字符串和重复次数)。

详细步骤

  1. 初始化栈和变量

    • 使用两个栈:一个存储重复次数(countStack),一个存储当前层之前的字符串(strStack)。
    • 定义 currentStr 存储当前正在构建的字符串,currentNum 存储当前解析的数字。
  2. 遍历字符串的每个字符

    • 对每个字符 c 分四种情况处理:
  3. 遇到数字('0' ≤ c ≤ '9')

    • 将字符转换为数字,并更新 currentNum。注意数字可能有多位,因此需要累加:
      currentNum = currentNum * 10 + (c - '0')
  4. 遇到左括号('[')

    • 将当前 currentNum 压入 countStack,表示即将进入一个新层,该层的重复次数为 currentNum
    • 将当前 currentStr 压入 strStack,保存外层已解析的字符串。
    • 重置 currentStrcurrentNum 为初始状态,准备解析括号内的新字符串。
  5. 遇到右括号(']')

    • countStack 弹出栈顶数字 repeatCount,表示当前层字符串的重复次数。
    • strStack 弹出栈顶字符串 prevStr,这是当前层之前的结果。
    • 将当前层的字符串 currentStr 重复 repeatCount 次,然后与 prevStr 拼接,更新 currentStr
    • 注意:此时 currentNum 不需要重置,因为右括号只结束当前层,数字可能在外层继续使用。
  6. 遇到字母(其他字符)

    • 直接将字符追加到 currentStr
  7. 遍历结束

    • 返回 currentStr,即最终解码结果。

示例推演
以 s = "3[a2[c]]" 为例:

  • 遍历 '3':currentNum = 3
  • 遍历 '[':countStack = [3], strStack = [""], currentStr = "", currentNum = 0
  • 遍历 'a':currentStr = "a"
  • 遍历 '2':currentNum = 2
  • 遍历 '[':countStack = [3, 2], strStack = ["", "a"], currentStr = "", currentNum = 0
  • 遍历 'c':currentStr = "c"
  • 遍历 ']':repeatCount = 2, prevStr = "a", currentStr = "a" + "c"*2 = "acc"
  • 遍历 ']':repeatCount = 3, prevStr = "", currentStr = "" + "acc"*3 = "accaccacc"
    输出:"accaccacc"

关键点

  • 栈帮助处理嵌套结构,每次遇到 [ 保存状态,遇到 ] 恢复状态并计算。
  • 数字可能多位,需要累加计算。
  • 时间复杂度 O(n),空间复杂度 O(n)。
字符串解码问题 题目描述 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为 k[encoded_string] ,表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 示例: 输入:s = "3[ a]2[ bc ]" 输出:"aaabcbc" 输入:s = "3[ a2[ c] ]" 输出:"accaccacc" 解题思路 这个问题需要处理嵌套的括号结构,适合用栈(Stack)来模拟递归过程。核心思路是遍历字符串,遇到数字、字母和括号时分别处理,利用栈暂存当前状态(已解析的字符串和重复次数)。 详细步骤 初始化栈和变量 使用两个栈:一个存储重复次数( countStack ),一个存储当前层之前的字符串( strStack )。 定义 currentStr 存储当前正在构建的字符串, currentNum 存储当前解析的数字。 遍历字符串的每个字符 对每个字符 c 分四种情况处理: 遇到数字('0' ≤ c ≤ '9') 将字符转换为数字,并更新 currentNum 。注意数字可能有多位,因此需要累加: currentNum = currentNum * 10 + (c - '0') 遇到左括号(' [ ') 将当前 currentNum 压入 countStack ,表示即将进入一个新层,该层的重复次数为 currentNum 。 将当前 currentStr 压入 strStack ,保存外层已解析的字符串。 重置 currentStr 和 currentNum 为初始状态,准备解析括号内的新字符串。 遇到右括号(']') 从 countStack 弹出栈顶数字 repeatCount ,表示当前层字符串的重复次数。 从 strStack 弹出栈顶字符串 prevStr ,这是当前层之前的结果。 将当前层的字符串 currentStr 重复 repeatCount 次,然后与 prevStr 拼接,更新 currentStr 。 注意:此时 currentNum 不需要重置,因为右括号只结束当前层,数字可能在外层继续使用。 遇到字母(其他字符) 直接将字符追加到 currentStr 。 遍历结束 返回 currentStr ,即最终解码结果。 示例推演 以 s = "3[ a2[ c] ]" 为例: 遍历 '3':currentNum = 3 遍历 ' [ ':countStack = [ 3], strStack = [ "" ], currentStr = "", currentNum = 0 遍历 'a':currentStr = "a" 遍历 '2':currentNum = 2 遍历 ' [ ':countStack = [ 3, 2], strStack = [ "", "a" ], currentStr = "", currentNum = 0 遍历 'c':currentStr = "c" 遍历 ']':repeatCount = 2, prevStr = "a", currentStr = "a" + "c"* 2 = "acc" 遍历 ']':repeatCount = 3, prevStr = "", currentStr = "" + "acc"* 3 = "accaccacc" 输出:"accaccacc" 关键点 栈帮助处理嵌套结构,每次遇到 [ 保存状态,遇到 ] 恢复状态并计算。 数字可能多位,需要累加计算。 时间复杂度 O(n),空间复杂度 O(n)。