func decodeString(s string) string {
	var sb strings.Builder
	beg, n := 0, len(s)
	for i := 0; i < n; {
		if '0' <= s[i] && s[i] <= '9' {
			sb.WriteString(s[beg:i])
			num, lb, rb := findNext(s, i) // Left bracket, right bracket
			substr := decodeString(s[lb+1 : rb])
			for j := 0; j < num; j++ {
				sb.WriteString(substr)
			}
			beg, i = rb+1, rb+1
		} else {
			i++
		}
	}
	if beg != n { // Write the last part
		sb.WriteString(s[beg:n])
	}
	return sb.String()
}

func findNext(s string, beg int) (int, int, int) {
	lb := beg + 1
	for ; s[lb] != '['; lb++ {
	} // Find lb
	num, _ := strconv.Atoi(s[beg:lb]) // Get repeat count
	cnt, n := 0, len(s)
	for i := lb; i < n; i++ {
		if s[i] == '[' {
			cnt++
		} else if s[i] == ']' {
			cnt--
			if cnt == 0 {
				return num, lb, i // Find rb
			}
		}
	}
	return num, lb, lb // Error
}