题解 | #火车进站#

火车进站

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 湖北

相关推荐

咪咪虫:小厂神人多,我昨天早上那个深圳500-1000人的厂,面试官迟到10分钟进来第一句话是:居然是个妹子,然后一直说自己没有准备什么的,全程八股都是支支吾吾的问。下午那个线下的广州280人的厂,二轮技术面一直在问我数据结构、操作系统、计算机网络,还问我高考多少分、为什么不上课、为什么住在学校外面、是什么时候高考的。。。脸上就是质疑和不屑,俩个体验感奇差
点赞 评论 收藏
分享
评论
9
8
分享

创作者周榜

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