你的代码有一些问题。首先,有几件事我想说:如果符号字符串不是以左括号开头,则代码将抛出错误。这是因为您在第一个if语句中初始化了new_bracket。这将导致问题,因为如果第一个字符不是左括号,它将尝试在elif语句中调用new_bracket,并且由于它尚未初始化,它将引发一个UnboundLocalError。这可以用elif symbol in [')', ']', '}']: return False来修复。因为以右括号开头显然意味着它的不平衡,这是有意义的,并防止程序在未初始化的情况下调用new_bracket。在
使用j变量是没有用的,因为您永远不会在if语句的范围之外使用它。您可以使用i。在
如果list.pop(i)超出brackets_stack的范围,则使用list.pop(i)可能会导致错误。您不需要索引,因为您希望符号位于堆栈的末尾,而这正是list.pop()自动执行的操作。在
elif len(brackets_stack) == 0:不应在for循环内。这应该在循环之外,因为您只想在处理完所有文本之后说success。在
new_bracket = Bracket(brackets_stack[j], j)在许多方面都是错误的。第一个是你不想用brackets_stack[j]来做一个新的符号,你想用text[j]或者更好的symbol来制作一个新的符号。另一个原因是,只有在看到新的左括号时才会更改此设置。但是,如果找到与该括号匹配的变量,因为您从未更改此变量,它将保持与前一个括号相同的位置。您应该重新声明您的new_bracket的符号应该是什么。这个名字本身就有误导性,下面就改了。在
考虑到所有这些,下面是一个您想做什么的修订版本,封装在一个函数中。有些东西你也需要添加到你的班级。在class Bracket:
def __init__(self, bracket_type, position):
self.bracket_type = bracket_type
self.position = position
def Match(self, c):
if self.bracket_type: //handles empty bracket_type
if self.bracket_type == '[' and c == ']':
return True
if self.bracket_type == '{' and c == '}':
return True
if self.bracket_type == '(' and c == ')':
return True
return False
//update function to use the same object instead of initializing a new one each time (better space complexity)
def update(self, new_type, new_position):
self.bracket_type = new_type
self.position = new_position
// pass in text to check if text has balanced brackets or not
def isBalanced(text):
brackets_stack = []
current_bracket = Bracket('',0) //initialize an empty bracket
for i, symbol in enumerate(str(text)):
print(brackets_stack)
if symbol in ['(', '[', '{']:
brackets_stack.append(symbol)
current_bracket.update(symbol, i) //call update function
elif symbol in [')', ']', '}']:
return False
elif new_bracket.Match(symbol):
brackets_stack.pop()
else: //since it assumes symmetrical balanced brackets, this can return False immediately
return False
//same as saying return len(list) == 0
return not(len(brackets_stack))
此代码假定text只包含括号。我不知道这是否是一个合理的假设,你应该记住这一点,无论你使用它的任何应用程序。而且,就像MTset在你的帖子上评论的那样,它也假设了简单、对称、平衡的方括号。[{]}将返回False,尽管它在技术上是平衡的。在