|
@@ -1,8 +1,40 @@
|
|
|
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 parseNext(s string, beg int) (s string, beg, end int) {
|
|
|
- return -1
|
|
|
+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
|
|
|
}
|