字符串解码
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
}