394.字符串编码
解题思路:
- 解析数字,注意:多位数字情况,例如:123[ab]
- 累计字符串
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
}