Decode String - LeetCode

給一個加密過的string,回傳解密後的string

加密規則:k[encoded_string] ,k代表括號裡面的string要重複幾次

數字只用作k,不會用作encoded_string

Example:

Input: s = "3[a]2[bc]"
Output: "aaabcbc"

Input: s = "3[a2[c]]"
Output: "accaccacc"

Input: s = "2[abc]3[cd]ef"
Output: "abcabccdcdcdef"

初始化一個stack

for loop 走訪 s (for l in s)

result = stack to string

return result

package main

import (
	"fmt"
	"strconv"
)

func main() {
	fmt.Println(decodeString("2[abc]3[cd]ef"))
}

// 2022/10/9 stack solution
func decodeString(s string) string {
	stack := []string{}

	for _, l := range s {

		current := string(l)

		if current == "]" {
			tmp := ""
			for len(stack) > 0 && stack[len(stack)-1] != "[" {
				top := stack[len(stack)-1]
				stack = stack[:len(stack)-1] // pop
				tmp = top + tmp

			}

			stack = stack[:len(stack)-1] // pop [

			k := ""
			for len(stack) > 0 && IsNumber(stack[len(stack)-1]) {
				top := stack[len(stack)-1]
				stack = stack[:len(stack)-1] // pop
				k = top + k
			}

			intK, _ := strconv.Atoi(k)

			newString := ""
			for i := 0; i < intK; i++ {
				newString += tmp
			}

			stack = append(stack, newString)

		} else {
			stack = append(stack, current)
		}

	}
	result := ""

	for i := 0; i < len(stack); i++ {
		result += stack[i]
	}

	return result

}

func IsNumber(s string) bool {
	for _, r := range s {
		if r < '0' || r > '9' {
			return false
		}
	}
	return true
}