我又太高看自己了,本以为很简单,结果让自己脑子抽筋了一天才搞定 #deep是递归深度控制标识,不用改。
def dc(s,deep=0):
#定义一个左括号游标i
i = 0
while True:
#首先检测有没有左括号
if s[i] in ['{','[','(']:
#记录左括号的类型left
left = s[i]
#再新定义一个右括号的游标j
j = i + 1
while True:
#当检测到左括号后紧接着检测右括号
if s[j] in ['}',']',')']:
right = s[j]
#如果右括号也检测到,则检测两个括号是否匹配
if left+right == '()' or left+right == '[]' or left+right == '{}':
#确定匹配后再判断当前递归深度,不是在最外层返回当前的层级长度。
if deep > 0:
return j
#在最外层,把左括号游标定位到当前位置,从当前位置往后再继续检测
i = j
#右括已经找到,退出重新检测左括号
break
else:
#如果左右两括号不匹配则返回False
return False
#没有找到右括号反而找到了左括号,则进入递归。
elif s[j] in ['{','[','(']:
#递归深度加一
deep = deep + 1
#进入递归,返回内层的长度或者返回False
next_back = dc(s[j:],deep)
#退出递归后把深度减一
deep = deep - 1
#返回False说明内层左右括号不匹配,向上一层抛False
if not next_back:
return False
#如果内层括号匹配,则把右括号游标向右移动内层的长度。
else:
j = j + next_back
#没有找到右括号就向右移动游标
j += 1
#判断当前右括号游标是否越界,如果越界说明缺少右括号,向上抛False
if j >= len(s):
return False
#如果在没有左括号的情况下先检测到了右括号则返回False
elif s[i] in ['}',']',')']:
return False
#没有找到左括号就向右移动游标
i += 1
#判断当前左括号游标是否越界,如果越界说明没有左括号,返回True
if i >= len(s):
return True
print(dc(input('请输入带N多个括号的字符串:')))
|