我有一个检查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("("))
谢谢!
答案 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