题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
提示:
- 1 <= s.length <= 30
- s 由小写英文字母、数字和方括号 ‘[]’ 组成
- s 保证是一个 有效 的输入。
- s中所有整数的取值范围为 [1, 300]
代码及注释
func decodeString(s string) string {// 用于存储解码后的字符串strStack := make([]string, 0) // 用于存储重复次数numStack := make([]int, 0) // 当前正在构建的字符串 res := "" // 当前的重复次数 num := 0 for _, str := range s {if str >= '0' && str <= '9' { // 如果是数字,更新重复次数num = num * 10 + int(str - '0')} else if str == '[' { // 如果是'[',将当前的重复次数和字符串保存到栈中,并重置重复次数和当前字符串strStack = append(strStack, res)numStack = append(numStack, num)res = ""num = 0} else if str == ']' { // 如果是']',从栈中取出保存的字符串和重复次数,进行字符串的重复构建tmp := strStack[len(strStack) - 1]nums := numStack[len(numStack) - 1]strStack = strStack[:len(strStack) - 1] // 弹出栈顶元素numStack = numStack[:len(numStack) - 1] // 弹出栈顶元素for i := 0; i < nums; i++ { // 将当前的字符串重复nums次并拼接到tmp上tmp += res}res = tmp // 更新当前的字符串为构建完成的字符串} else {res += string(str) // 如果是普通字符,直接拼接到当前的字符串上}}return res
}
代码解释
使用两个栈,一个用于存储字符串,另一个用于存储重复次数。遍历输入字符串,根据字符类型进行相应的处理,最后得到解码后的字符串。
时间复杂度:O(n),其中 n 是字符串 s
的长度。这是因为算法只需遍历一次输入字符串。
空间复杂度:O(n),在最坏的情况下,两个栈都可能存储 n/2 个元素。