问题描述
我正在尝试解决 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)
如何用最少的时间和最少的空间解决这个问题?
解决方法
我建议在行首或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。祝你好运!
,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))