【问题标题】:Bracket Question in Python . Solve in Minimum Time and Space? [closed]Python 中的括号问题。在最小时间和空间内求解? [关闭]
【发布时间】:2020-09-18 13:34:32
【问题描述】:

我正在尝试解决 https://www.hackerearth.com/practice/data-structures/arrays/1-d/practice-problems/algorithm/bracket-sequence-1-40eab940/submissions/ 在 python 中

它显示时间超过错误。谁能告诉我如何降低时间复杂度? 这是我的代码:

def findBalanced(expr):

    stack = []
    for char in expr:
        if char in ['(']:
            stack.append(char)
        else:
            if not stack:
                return False
            current_char = stack.pop()
            if current_char == '(':
                if char != ')':
                    return False
           

    if stack:
        return False
    return True

if __name__ == '__main__':
    expr = input()
    count = 0
    for x in range(len(expr)):
        expr = expr[1:] + expr[0]
        if findBalanced(expr):
            count +=1
        else:
            pass
    print(count)

如何用最少的时间和最少的空间解决这个问题?

【问题讨论】:

  • 你能告诉我们你到底想解决什么问题吗?在这里,而不是其他地方?
  • 我没有点击链接,但是链接包含“括号序列”并且代码定义了一个返回布尔值的函数“findBalanced”,所以我猜目标是获取一个字符串() 并判断它是否是正确的括号表达式;例如,(()())() 是正确的,但 (() 是不正确的。
  • 嗨@Stef,不,这不是正确的问题。请按照说明访问链接

标签: python string algorithm data-structures array-algorithms


【解决方案1】:

我建议在开头添加print(stack) 行或for 循环。然后在几个示例输入上执行您的算法。你可能会注意到一些奇怪的东西。

请花点时间实际去做,并尝试找出它有什么奇怪之处。这将为您提供有关如何改进算法的灵感。

...

你做到了吗?请在完成之前不要继续阅读。

此答案的其余部分假定您在 for 循环的开头添加了print(stack),并且您已经查看了一些输入示例的输出,并且您尝试注意到一些令人惊讶的事情关于输出。请在阅读此答案的其余部分之前这样做。

您的算法维护一个堆栈,但如果您在每次迭代时输出堆栈,您会注意到一些事情:堆栈只包含字符( 的副本。没有其他的。这是因为stack.append(char) 的唯一出现就在if char in ['(']: 的正下方,所以您只需要附加(

所以这个堆栈中包含的唯一信息是它包含多少(。您可以简单地维护一个计数器,,而不是实际维护堆栈,它是一个整数,告诉您如果有一个堆栈,堆栈上有多少 (

stack = [] 替换为depth = 0,然后将stack.append(char) 替换为depth += 1,将stack.pop() 替换为depth -= 1

你的检查if current_char == '(':一点用处都没有,因为堆栈上的字符都是(,所以检查总是正确的,因此是多余的。

我会让你弄清楚计数器的哪些值应该返回 true,哪些值应该返回 false。祝你好运!

【讨论】:

  • 谢谢。让我尝试根据您给出的建议改进我的代码。与此同时,我在 HackerEarth 上看到了最好的解决方案:
【解决方案2】:
def solve(s):
    p=0
    t=0
    res = 0
    for i in s:
        if(i=='('):
           
            p+=1
           
        else:
          
            p -= 1
          
        if (p<t):
            print(f"Values of p and t are {p} and {t}")
            t=p
            res = 0
        if(t==p):

            res+=1
            
    if p:
        return 0
    else:
        return res
s= input()
print(solve(s))

【讨论】:

  • @Stef 你能解释一下吗
  • 嗨!事实证明,如果 Stef 之前没有评论过那篇文章,那么在 StackOverflow 中写“@Stef”没有任何效果。所以,我没有收到通知,我才看到你的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多