含普通字符的Valid Parenthesis验证始终返回False,求技术协助
修复包含普通字符的有效括号验证代码
你的代码存在三个核心问题,导致遇到普通字符时返回False,以下是问题分析和修复方案:
问题点
- 遍历对象错误:函数内部循环遍历的是全局变量
str1,而非传入的参数test_str,导致函数无法正确处理自定义输入。 - 未忽略普通字符:遇到非括号字符时,没有跳过处理,反而进入else分支执行栈弹出和匹配判断,这会直接导致错误(普通字符不可能匹配任何括号)。
- 错误的长度校验:直接通过字符串总长度是否为偶数判断有效性不合理,因为普通字符的存在会让总长度可能为奇数,但括号本身是成对有效的(比如
"(a)"总长度3,但括号合法)。
修复后的代码
str1 = '((a))[]' def isValid(test_str): par_dict = {'(':')','{':'}','[':']'} stack = [] for char in test_str: # 处理开括号:入栈 if char in par_dict: stack.append(char) # 处理闭括号:匹配栈顶开括号 elif char in par_dict.values(): if not stack: return False open_brac = stack.pop() if char != par_dict[open_brac]: return False # 普通字符直接跳过,不做任何处理 # 最后栈必须为空,说明所有开括号都找到了对应的闭括号 return len(stack) == 0 # 测试示例 print(isValid(str1)) # 输出: True
关键修改说明
- 改为遍历传入的
test_str,保证函数的通用性和正确性。 - 仅对开括号、闭括号做逻辑处理,普通字符直接跳过。
- 移除了总长度奇偶校验,改为最终通过栈是否为空判断括号是否完全匹配。
- 优化字典判断逻辑,
char in par_dict直接判断是否为开括号,代码更简洁。
内容的提问来源于stack exchange,提问作者Elioth2022
相关产品推荐
相关产品推荐

