题解 | #火车进站#

火车进站

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))



全部评论
这种方法属实是有点离谱,尤其是验证是否符合出栈顺序的代码,如果排列可以和真实出入栈过程匹配上就为True,而排列包含了所有可能性,不管排列是什么,只要排列顺序的列头出现在栈尾就应该出栈,按这个循环下去,如果所有的对象都能出栈,则该排列有效
点赞 回复 分享
发布于 2023-10-15 17:04 广东
这种方法真的最容易看懂!!!爱了
点赞 回复 分享
发布于 2023-04-11 22:46 湖北

相关推荐

真的很糟糕:欲哭无泪
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-04 18:02
好不容易拿到了字节Offer,鼠鼠做后端的,但家里人觉得可能被裁员不稳定,让鼠鼠去投国企,现在好纠结到底该咋选
文档传偷助手:该投就投吧,不过建议别放弃offer 拿到手里的才是最好的
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
8
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务