LeetCode20有效括号题:zip生成字典键值对匹配异常
问题分析与解决:LeetCode 20题「有效的括号」字典键值不匹配问题
问题根源
你代码里的核心bug是用无序的集合(set)来生成字典的键值对:
- Python的集合没有固定遍历顺序,每次运行时
open_braces_set和close_braces_set的元素顺序可能随机变化,导致zip出来的字典映射完全错位(比如'{'可能对应']','['对应')'),这就是答案偶尔出错的原因。
修正方案
方案1:用列表替代集合,保证顺序对应
把原来的集合改成列表,这样zip时的键值对应关系就固定了:
class Solution: def isValid(self, s: str) -> bool: opened_ls = [] # 换成有序的列表,确保左括号和右括号一一对应 open_braces = ['{', '[', '('] close_braces = ['}', ']', ')'] d = dict(zip(open_braces, close_braces)) for symb in s: if symb in open_braces: opened_ls.append(symb) else: try: if d[opened_ls.pop()] != symb: return False except Exception: # 遇到右括号但无匹配的左括号,直接返回False return False # 检查是否有未闭合的左括号 return not opened_ls
方案2:直接手动定义字典(更推荐)
跳过zip,直接写出明确的键值映射,代码更直观也不容易出错:
class Solution: def isValid(self, s: str) -> bool: opened_ls = [] # 直接定义正确的括号映射关系 d = {'{': '}', '[': ']', '(': ')'} for symb in s: if symb in d: opened_ls.append(symb) else: try: if d[opened_ls.pop()] != symb: return False except Exception: return False return not opened_ls
补充说明
你预期dict(zip(list1, list2))生成固定键值对是对的,但这个前提是list1和list2是有序容器(比如列表、元组),集合是无序结构,绝对不能用来做这种依赖顺序的映射生成。
内容的提问来源于stack exchange,提问作者Luchok
相关产品推荐
相关产品推荐

