题目描述:具体描述见原题。简单来说就是按照一定规则生成字符串。
解题思路:碰到这种特殊符号、数字组合在一起,然后要求返回字符串的题目,大多数都可以考虑使用栈来处理,这道题大体思路就是逐层处理左右括号已经匹配内的字符串,将处理完成的字符串压入栈中,最后一次遍历完成字符串拼接,具体过程见代码。
具体代码:
func decodeString(s string) string {
stack, res := make([]string, 0), ""
for _, s := range s {
if s != ']' { // 将']'之前的内容依次入栈
stack = append(stack, string(s))
} else { // 出现'[' 和 ']'匹配的情况
temp := ""
for stack[len(stack)-1] != "[" { // 将括号之间的内容依次出栈,拼接完成的temp即为要重复的单位字符串,这里要注意拼接顺序
temp = stack[len(stack)-1] + temp // 注意不要写成temp+=stack[len(stack)-1]
stack = stack[:len(stack)-1]
}
stack = stack[:len(stack)-1] // 完成匹配的'['出栈
r := ""
for len(stack) > 0 && stack[len(stack)-1] >= "0" && stack[len(stack)-1] <= "9" { // 构造需重复次数,就是从栈中还原数字
r = stack[len(stack)-1] + r // 同样要注意拼接顺序
stack = stack[:len(stack)-1]
}
num, _ := strconv.Atoi(r)
coStr := ""
for i := 0; i < num; i++ {
coStr += temp
}
stack = append(stack, coStr) // 将本次完成结果入栈,参与后续操作
}
}
for _, s := range stack { // 拼接最终返回结果
res += s
}
return res
}
补充说明:这道题出栈入栈以及括号相匹配的思想是栈基本操作。需要注意拼接顺序,举个例子,在还原数字过程中如果写成了 r += stack[len(stack)-1],那么执行测试用例"10[gyh]"时,不会输出"gyhgyhgyhgyhgyh....",会输出"gyh",是因为原本应该构造数字10,写反了的话就变成了1。