检查平衡括号python

时间:2019-12-18 13:08:12

标签: python

我有一个检查python上平衡括号的任务,并且我需要通过递归方法解决此问题。那就是我所做的,但是似乎没有用。我将不胜感激。

def is_valid_paren(s, cnt=0):
    if len(s) == 0 and cnt >= 0:
        return True
    if len(s) == 0 and cnt != 0:
        return False
    for char in s:
        if cnt < 0:
            return False
        if char == '(':
            cnt+=1
            return is_valid_paren(s[1:], cnt)
        if char == ')':
            cnt-=1
            return is_valid_paren(s[1:], cnt)
print (is_valid_paren("("))

谢谢!

4 个答案:

答案 0 :(得分:1)

您的代码中的问题是支票cnt >= 0。这不是您想要的, 因为这意味着您将接受任何开头比结尾更多的字符串 括号。相反,您应该检查cnt == 0。但是如果你要回来 True内的if,否则False内,您也可以 return语句的条件。

此外,循环不会超出第一个字符,因此最好 只需编写而无需循环:

if

答案 1 :(得分:0)

这是解决方案:

def is_valid_paren(s, cnt=0):
    if len(s) == 0 and cnt != 0:
        return False
    if len(s) == 0 and cnt == 0:
        return True
    for char in s:
        if cnt < 0:
            return False
        if char == '(':
            cnt+=1
            return is_valid_paren(s[1:], cnt)
        if char == ')':
            cnt-=1
            return is_valid_paren(s[1:], cnt)
print (is_valid_paren("(())"))

答案 2 :(得分:0)

def is_valid_paren(s, cnt=0):
    if len(s) == 0:
        if cnt >= 0:
            return True
        elif cnt != 0:
            return False
    for char in s:
        if cnt < 0:
            return False
        if char == '(':
            cnt += 1  
        elif char == ')':
            cnt -= 1
    return is_valid_paren(s[1:-1], cnt) # Take parenths from both sides 

print (is_valid_paren("(())"))

答案 3 :(得分:0)

您可以在此处看到一个递归解决方案,请注意,不需要使用for循环,如 luigigi 所述:

def is_balanced(s):
    return helper(s,0)

def helper(s, numP):
    if len(s)==0: return numP==0
    if numP < 0: return False
    if s[0] == "(": return  helper(s[1:], numP+1)
    elif s[0] == ")": return  helper(s[1:], numP-1)
    return helper(s[1:], numP)

if __name__ == '__main__':
    print(is_balanced("(()()"))
    print(is_balanced("(())"))

这里不需要辅助功能;简单测试用例的输出为:

False
True