题解 | #火车进站#
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
# 这道题目考了俩个 考点: # 1、dfs回溯算法 写全排列 参考 leecode 46. 全排列 # 2、判断是否为合法栈输出 参考 leecode 946. 验证栈序列 # 我在这里直接用两个方法 封装起来了。 def dfs(values,nums): path,result,used = [],[],[False for _ in range(nums)] def dfs_inner(values): if len(path)==nums: if illegal(path.copy()): # 把判断是否合法 嵌入回溯算法中,不然用两个方法前后相衔接的方式写,会超时。 result.append(path.copy()) for i in range(nums): if used[i]==True: continue used[i] = True path.append(values[i]) dfs_inner(values) # 排列和组合这里有区别,这里是排列。 path.pop() used[i] = False dfs_inner(values) return result def illegal(result)->bool: # 模拟入栈、出栈,判断出栈顺序是否合理. stack_ = [] for i in values: # 入栈 stack_.append(i) while stack_!=[] and stack_[-1]==result[0]: # 栈顶==出栈值,栈和出栈序列一起弹出; stack_.pop() result.pop(0) if stack_==[]: return True else: return False if __name__=='__main__': nums = int(input()) values = input().split(' ') result_all = sorted(dfs(values,nums)) for i in result_all: print(' '.join(i))