394.decode-string.go 838 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. func decodeString(s string) string {
  2. var sb strings.Builder
  3. beg, n := 0, len(s)
  4. for i := 0; i < n; {
  5. if '0' <= s[i] && s[i] <= '9' {
  6. sb.WriteString(s[beg:i])
  7. num, lb, rb := findNext(s, i) // Left bracket, right bracket
  8. substr := decodeString(s[lb+1 : rb])
  9. for j := 0; j < num; j++ {
  10. sb.WriteString(substr)
  11. }
  12. beg, i = rb+1, rb+1
  13. } else {
  14. i++
  15. }
  16. }
  17. if beg != n { // Write the last part
  18. sb.WriteString(s[beg:n])
  19. }
  20. return sb.String()
  21. }
  22. func findNext(s string, beg int) (int, int, int) {
  23. lb := beg + 1
  24. for ; s[lb] != '['; lb++ {
  25. } // Find lb
  26. num, _ := strconv.Atoi(s[beg:lb]) // Get repeat count
  27. cnt, n := 0, len(s)
  28. for i := lb; i < n; i++ {
  29. if s[i] == '[' {
  30. cnt++
  31. } else if s[i] == ']' {
  32. cnt--
  33. if cnt == 0 {
  34. return num, lb, i // Find rb
  35. }
  36. }
  37. }
  38. return num, lb, lb // Error
  39. }