我写了下面的递归代码来匹配括号。在某些情况下,我得到“ True”,但是如果我在字符串的某个位置添加新的括号,这是不正确的,那么我仍然会得到“ True”。我调试了它,但不知道如何解决,如何解决?
def is_balanced(parenthesis):
if len(parenthesis) %2 == 1:
return False
left_value = parenthesis[:1:]
right_value = parenthesis[-1::]
return is_balanced(parenthesis[1:-1:]) if left_value != right_value else
True
print(is_balanced('(()()[]()())')) => #True
print(is_balanced('(()()[[()())')) => #still True
答案 0 :(得分:2)
一种递归方法如下:
def is_balanced(parenthesis):
l = len(parenthesis)
if l == 0:
return True
else:
if '()' in parenthesis or '[]' in parenthesis:
return is_balanced(parenthesis.replace('()', '').replace('[]', ''))
else:
return False
print(is_balanced('(()()[]()())')) # True
print(is_balanced('(()()[[()())')) # False
这里的想法是递归地用一个空字符串替换闭括号和闭括号,并查看是否以空字符串结尾。
一种更简单但不递归的方法是:
def is_balanced(parenthesis):
brackets = ['()', '{}', '[]']
while any(x in parenthesis for x in brackets):
for br in brackets:
parenthesis = parenthesis.replace(br, '')
return not parenthesis
答案 1 :(得分:2)
这是一个相当简洁的基于正则表达式的实现:
import re
def is_balanced(par):
pattern = re.compile('\(\)|{}|\[\]') # matches '()', '[]', or '{}'
return not par or bool(pattern.search(par)) and is_balanced(pattern.sub('', par))