如何用递归实现括号有效性校验及现有代码失效原因分析
原有代码失效原因分析
- 计数逻辑完全错误:你当前写的
if "(" in s是判断剩余整个子串中是否存在左括号,而不是判断当前遍历的第一个字符是否为左括号,每一轮都会错误地累加/减计数。 - 计数没有传递到下一层递归:你调用
is_valid_paren(s[1:])时没有传入计算后的cnt参数,每一层递归的cnt都会重置为默认值0,全局计数完全不生效。 - 缺少边界判断:没有判断
cnt中途为负的情况(出现右括号早于左括号的场景直接就可以判定无效),遍历结束后也没有判断最终cnt是否为0(即左右括号数量是否相等),只要遍历完所有字符无论计数结果都会返回True。
你提到的部分输入返回正确完全是巧合,本质是原有逻辑完全不满足校验要求。
符合要求的递归实现(无循环)
def is_valid_paren(s, cnt=0): # 中途计数为负,说明右括号多于左括号,直接无效 if cnt < 0: return False # 遍历完所有字符,判断左右括号数量是否相等 if s == "": return cnt == 0 # 仅根据当前第一个字符更新计数 current_char = s[0] if current_char == '(': new_cnt = cnt + 1 elif current_char == ')': new_cnt = cnt - 1 else: # 非括号字符不影响计数 new_cnt = cnt # 传递新的计数到下一层递归 return is_valid_paren(s[1:], new_cnt)
上述实现完全基于递归逻辑,没有使用任何循环,支持忽略非括号字符的校验,覆盖所有规则要求:
- 中途出现右括号多于左括号的情况直接返回False
- 遍历结束后校验左右括号数量是否相等
- 仅处理括号字符,其他字符不影响校验结果
内容的提问来源于stack exchange,提问作者sds
相关产品推荐
相关产品推荐

