394. 字符串解码 中等

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(decodeString("3[a]2[b4[F]c]")) // aaabFFFFcbFFFFc
}

// 考虑 case
// 字母大小写
// 数字和字母不止一个,需进行进制和字符的暂存
// 分数字栈、字符栈进行计算,遇到 ] 触发一次计算

// go run stack.go str_stack.go 394_xxx.go
func decodeString(s string) string {
    var (
        n    int
        res  string
        nums Stack
        str  StrStack
    )
    for _, r := range s {
        switch {
        case '0' <= r && r <= '9':
            n = 10*n + int(r-'0')
        case ('a' <= r && r <= 'z') || ('A' <= r && r <= 'Z'):
            res += string(r)
        case r == '[': // 双双进栈
            nums.Push(n)
            n = 0
            str.Push(res)
            res = ""
        case r == ']': // 双双出栈计算值
            repeat := res
            for i := 0; i < nums.Peek()-1; i++ {
                res += repeat
            }
            res = str.Pop() + res
            nums.Pop()
        }
    }
    return res
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng