|
发表于 2019-4-29 13:03:55
|
显示全部楼层
我又太高看自己了,本以为很简单,结果让自己脑子抽筋了一天才搞定
- #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多个括号的字符串:')))
复制代码 |
|