394.字符串编码

解题思路:

  1. 解析数字,注意:多位数字情况,例如:123[ab]
  2. 累计字符串
func decodeString(s string) string {
      var currNum = 0 // [ 前的计数
      var currStr string // 当前已完成编码的字符串
      var stack []string // 数字+[]内的字符串
      
      for _, ch := range s {
          // 处理数字
          if ch >= '0' && ch <= '9' {
              tmpNum, _ := strconv.Atoi(string(ch))
              // 兼容多位数字
              currNum = currNum * 10 + tmpNum
          }else if ch == '[' { // 重复字符串开始
              stack = append(stack, currStr)
              stack = append(stack, strconv.Itoa(currNum))
              // 重置 currNum, currStr
              currNum = 0
              currStr = ""
          }else if ch == ']' { // 重复字符串结束
              // 弹出重复次数
              repeatNum, _ := strconv.Atoi(stack[len(stack)-1])
              stack := stack[:len(stack)-1] // 更新stack
              // 弹出前面已编码的字符串
              prevStr := stack[len(stack)-1]
              stack := stack[:len(stack)-1] // 再更新stack 
              
              // 拼接已编码的字符串
              currStr = prevStr + strings.Repeat(currStr, repeatNum)
          }else {
              currStr += string(ch)
          }
      }
      return currStr
}