给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入
题目如上,大意就是给定一个字符串,其中有格式为num [str]的字符串,我们需要将这些格式的字符串变换为num * str格式的字符串,就是重复了num次的str,由于给定了''[]'来帮助我们定位,根据经典的表达式求值这道题,我们可以联想到通过栈来解决,需要注意的是,数字的范围是1~300。
func decodeString(s string) string {
var nums []int
var strs []string
i := 0
for i < len(s) {
if s[i] >= '0' && s[i] <= '9' {
num := 0
// 读取完整的数字(数字可以有多位)
for i < len(s) && s[i] >= '0' && s[i] <= '9' {
num = num*10 + int(s[i]-'0')
i++
}
nums = append(nums, num)
} else if s[i] == '[' {
strs = append(strs, "") // 新建一个空字符串,用来保存当前括号内的内容
i++
} else if s[i] == ']' {
// 当遇到 ] 时,开始解码
num := nums[len(nums)-1]
nums = nums[:len(nums)-1]
// 获取当前括号内的内容
str := strs[len(strs)-1]
strs = strs[:len(strs)-1]
// 连接之前的字符串
var pre string
if len(strs) > 0 {
pre = strs[len(strs)-1]
strs = strs[:len(strs)-1]
} else {
pre = ""
}
// 将当前括号内的字符串重复 num 次
for k := 0; k < num; k++ {
pre += str
}
// 将结果添加到 strs 中
strs = append(strs, pre)
i++
} else {
// 处理字母字符,直接加到当前字符串
if len(strs) == 0 {
strs = append(strs, "") // 确保 strs 不为空
}
strs[len(strs)-1] += string(s[i])
i++
}
}
return strs[0]
}
func decodeString(s string) string {
var strs []string
var nums []int
i := 0
for i < len(s) {
if s[i] <= '9' && s[i] >= '0' {
num := 0
for s[i] <= '9' && s[i] >= '0' && i < len(s) {
num = num * 10 + int(s[i] - '0')
i ++
}
nums = append(nums, num)
} else if s[i] == '[' {
strs = append(strs, "")
i ++
} else if s[i] == ']' {
num := nums[len(nums) - 1]
nums = nums[:len(nums) - 1]
str := strs[len(strs) - 1]
strs = strs[:len(strs) - 1]
pre := ""
if len(strs) > 0 {
pre = strs[len(strs) - 1]
strs = strs[:len(strs) - 1]
}
for j := 0; j < num; j ++ {
pre += str
}
strs = append(strs, pre)
i++
} else {
if len(strs) == 0 {
strs = append(strs, "")
}
strs[len(strs) - 1] += string(s[i])
i ++
}
}
return strs[0]
}