编译器和解析器,codechef上的错误答案

时间:2018-12-30 01:47:05

标签: python python-3.x stack

您可以在下面的链接中找到问题 https://www.codechef.com/problems/COMPILER 我想仅通过使用堆栈结构来解决此问题,而不能以任何其他简单的方式来解决。 我已经检查了所有可能的6个字符长度输入的输出,但是找不到任何错误的答案(我比较了正确解决方案的输出) 请找到算法会给出错误答案的任何组合。

class Stack:
    def __init__(self):
        self.items=[]
    def isempty(self):
        return self.items==[]
    def push(self,item):
        self.items.append(item)
    def pop(self):
        self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)
for j in range(int(input())):
    arr=[x for x in input()]
    s=Stack()
    balanced=True
    answer=0
    fanswer=0
    for h in range(len(arr)):
        if arr[h]=="<":
            s.push("<")
        else:
            if s.isempty():

                break
            else:
                s.pop()
                if not s.isempty():
                    balanced=False
                    answer=answer+1
                else:
                    balanced=True
                    fanswer=fanswer+1


                if h==(len(arr)-1) and s.isempty()!=True:
                    answer=0
    if balanced==False: answer=0                
    print((answer+fanswer)*2)

编辑:我使用了两个变量来存储答案 考虑情况'<> <'和'<<> <'

1 个答案:

答案 0 :(得分:0)

考虑表达式 << >> <<>

当您到达第二个> 字符时, answer 等于1,而 fanswer 等于1。表达式是平衡的直到第四个字符。

当您到达最后一个> 时,您会递增 answer ,但随后会遇到以下问题:

 如果h ==(len(arr)-1)和s.isempty()!= True:
    答案= 0
 

因此您将 answer 设置为0,因为您位于字符串的末尾并且堆栈也不为空。结果是(answer + fanswer)* 2 返回2,这是不正确的。正确答案是4。

只需跟踪表达式平衡的最后一个索引,就可以大大简化代码。总体思路如下。请注意,它并非完全是Python代码,但您应该能够轻松转换。

  balancePos = -1

对于范围n(arr)
    如果(arr [n] ==“ <”)
        stack.push(“ <”)
    其他
        如果(stack.isEmpty())
            打破;
        stack.pop()
        如果(stack.isEmpty())
            balancePos = n
打印(balancePos + 1)
 

顺便说一句,我知道您说过您想使用堆栈来执行此操作,但实际上没有理由使用堆栈。您可以使用一个初始化为0的简单计数器来实现。将每个 stack.push 用一个计数器增量替换,并将每个 stack.pop 用一个减量替换。并且 if(stack.isEmpty())变成 if(counter == 0)

这消除了堆栈溢出的可能性,并且速度也要快得多。