12345678910111213141516171819202122232425262728293031323334353637383940 |
- 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
- }
|