leetcode-394

173 阅读2分钟

题目描述:具体描述见原题。简单来说就是按照一定规则生成字符串。

解题思路:碰到这种特殊符号、数字组合在一起,然后要求返回字符串的题目,大多数都可以考虑使用栈来处理,这道题大体思路就是逐层处理左右括号已经匹配内的字符串,将处理完成的字符串压入栈中,最后一次遍历完成字符串拼接,具体过程见代码。

具体代码:

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。