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