匹配括号递归

时间:2018-11-16 10:35:07

标签: python

我写了下面的递归代码来匹配括号。在某些情况下,我得到“ 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

2 个答案:

答案 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))