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