LeetCode有效括号题目求解时出现KeyError: ')'报错是什么原因
LeetCode有效括号题运行报错排查
题目说明
求解LeetCode简单算法题:给定一个仅包含(、)、{、}、[、]的字符串s,判定输入是否为有效括号串。有效括号串需满足两个条件:
- 左括号必须由相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
针对测试用例"()[]{}"运行代码时触发报错。
提交的问题代码
class Solution: def isValid(self, s: str) -> bool: matchdict = {'(': ')', '{': '}', '[': ']'} slen = len(s) if slen%2!=0: return False for i in range(slen // 2): if (matchdict[s[i]] != s[slen-i-1] and (matchdict[s[2*i]] != s[2*i+1])): return False return True
运行报错信息
KeyError: ')' if (matchdict[s[i]] != s[slen-i-1] and (matchdict[s[2*i]] != s[2*i+1])): Line 9 in isValid (Solution.py) ret = Solution().isValid(param_1) Line 32 in _driver (Solution.py) _driver() Line 43 in <module> (Solution.py)
问题原因分析
直接报错原因
定义的matchdict仅以三种左括号作为键,没有添加右括号到映射中。当循环访问到字符串里的右括号时,直接将右括号作为键去字典中查询,就会触发KeyError。
以测试用例"()[]{}"为例,字符串总长度为6,循环变量i的取值范围是0、1、2:
- 当
i=1时,s[i]取到索引1位置的字符),该字符不在matchdict的键集合中,执行matchdict[s[i]]时直接抛出键不存在的错误,和报错栈信息完全吻合。
代码逻辑缺陷
就算修复了KeyError问题,当前代码的判定逻辑也完全不满足题目要求,核心问题是对括号匹配的规则理解有偏差:
- 代码试图同时用「首尾位置对称匹配」「相邻位置成对匹配」两种规则判定,且用
and连接判断条件——只有两种匹配规则同时不满足时才会判定为无效,漏判率极高。 - 这两种规则都无法覆盖括号的嵌套场景:比如合法用例
"{[]}"既不符合逐对相邻匹配,也不会被当前逻辑正确识别;非法用例"([)]"反而会因为首尾位置匹配被误判为有效。 - 括号匹配的核心是嵌套顺序校验,常规正确实现需要借助栈结构:遍历字符串时遇到左括号压栈,遇到右括号时弹出栈顶元素校验是否匹配,遍历结束后再确认栈已清空,才能覆盖所有合法/非法场景。
内容的提问来源于stack exchange,提问作者Mr. Black
相关产品推荐
相关产品推荐

