字符串解码

var (
	S        string
	n        int
	startIdx int
	curIdx   int
)
 
func decodeString(s string) string {
	S = s
	n = len(s)
	startIdx = 0
	curIdx = 0
	stack := []*Info{{count: 1}}
 
	for curIdx < n {
		char := s[curIdx]
		stackLastIdx := len(stack) - 1
		if char >= '0' && char <= '9' {
			startIdx = curIdx
			stack[stackLastIdx].chars.WriteString(s[startIdx:curIdx])
			stack = append(stack, &Info{count: getCount()})
			curIdx++
		} else if char == ']' {
			info := stack[stackLastIdx]
			stack = stack[:stackLastIdx]
			stack[stackLastIdx-1].chars.WriteString(strings.Repeat(info.chars.String(), info.count))
			curIdx++
		} else {
			startIdx = curIdx
			getText()
			stack[stackLastIdx].chars.WriteString(s[startIdx:curIdx])
		}
	}
 
	return stack[0].chars.String()
}
 
func getCount() int {
	for ; curIdx < n; curIdx++ {
		if S[curIdx] < '0' || S[curIdx] > '9' {
			break
		}
	}
	count, _ := strconv.Atoi(S[startIdx:curIdx])
	return count
}
 
func getText() {
	for ; curIdx < n; curIdx++ {
		char := S[curIdx]
		if !(char >= 'a' && char <= 'z' || char >= 'A' && char <= 'Z') {
			break
		}
	}
}
 
type Info struct {
	count int
	chars strings.Builder
}