1. 题目描述
根据入栈的顺序,输出所有的出栈顺序。例如:入栈顺序为123,出栈的顺序为:123,132,213,231,321
2. 题目解析
采用回溯法和递归统计所有可能的出栈序列。
(1)当所有的入栈序列已经全部入栈后,则只能出栈。
(2)当栈为空时,只能进栈。
(3)当仍有入栈元素且栈不为空时,可以入栈,也可以出栈。
入栈 -> 递归处理下一个入栈元素 -> 恢复未入栈状态
出栈 -> 将出栈元素添加到出栈序列 -> 递归处理当前入栈元素 -> 恢复栈和出栈序列上一个的状态
3. 代码
import sys
s = sys.stdin.readline().strip()
class Solution:
def __init__(self,s):
# s为字符串或list
self.s = s
self.n = len(s)
self.result = []
def all_unstack(self,i,stack,seq):
if i == self.n:
if stack:
top = stack.pop()
seq.append(top)
self.all_unstack(i,stack,seq)
stack.append(top) # 回溯
seq.pop()
else:
self.result.append(''.join(seq))
else:
# 对于一个输入元素,可以入栈;可以不入,弹出栈中已有元素
# 入栈
stack.append(self.s[i])
self.all_unstack(i+1,stack,seq)
stack.pop() # 回溯
# 出栈
if stack:
top = stack.pop()
seq.append(top)
self.all_unstack(i,stack,seq)
seq.pop() # 回溯
stack.append(top)
def print_all_sequence(self):
for each in self.result[::-1]:
print(each)
solution = Solution(s)
solution.all_unstack(0,[],[])
solution.print_all_sequence()