尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

python hot 100——2 栈(自存)

python hot 100——2 栈(自存) 20 有效的括号1. 题目要求输入一个只包含()[]{}的字符串比如()、()[]{}、(]输出True或False规则左括号必须和相同类型的右括号闭合且顺序正确。输入结果原因()True左右匹配()[]{}True三对都匹配(]False(和]类型不同([)]False虽然类型对但顺序错了(还没闭合就先闭合了[{[]}True先开{再开[先闭]再闭}嵌套正确2. 整体思路核心思想遇到左括号就记下来遇到右括号就看能不能和最近记下来的左括号配对。为什么用栈栈是后进先出 —— 最后打开的括号要最先关闭。就像俄罗斯套娃最后放进去的那个得先拿出来。以{[]}为例一步步走步骤当前字符操作栈内内容从左到右是栈底→栈顶1{左括号入栈[?,{]2[左括号入栈[?,{,[]3]右括号和栈顶[配对成功出栈[?,{]4}右括号和栈顶{配对成功出栈[?]5结束栈只剩?说明全部匹配✅True以(]为例步骤当前字符操作栈内1(左括号入栈[?,(]2]右括号栈顶是(但(对应的是)不是]不匹配❌ 直接返回False3. 题解代码 扩展为完整程序的代码class Solution: def isValid(self, s): :type s: str :rtype: bool dic {{: }, [: ], (: )} stack [ ] for c in s: if c in dic: stack.append(c) else: # 当前是右括号 # 重点先判断栈是不是空空代表没有左括号和它配对 if len(stack) 0: return False dic[stack.pop()] ! c: return False return len(stack) 1 if __name__ __main__: sol Solution() test_cases [(), ()[]{}, (], ([)], {[]}, ] for case in test_cases: print(sol.isValid(case))4. 超详细代码逐行讲解class Solution: def isValid(self, s): # 定义方法self 固定写s 是输入字符串 :type s: str # s 是字符串 :rtype: bool dic {{: }, [: ], (: )} # 字典左括号→右括号映射 stack [] # 初始化【栈】 for c in s: # 遍历字符串每个字符 if c in dic: # 如果 c 对应字典里的 key左括号或? stack.append(c) # 左括号入【栈】记下来 else: # 当前是右括号 # 重点先判断栈是不是空空代表没有左括号和它配对 if len(stack) 0: return False dic[stack.pop()] ! c: # 否则 c 是右括号弹出栈顶查字典对比 return False # 不匹配直接返回 False return len(stack) 1 # 遍历完检查栈是否只剩?dic[stack.pop()] ! c等价拆开后的代码top_char stack.pop() # 第一步弹出栈顶元素同时栈里面删掉这个元素match_right dic[top_char] # 第二步拿栈顶左括号查它应该匹配什么右括号。if match_right ! c: # 第三步拿 “应该的右括号” 和 “当前读到的右括号 c”对比return False # 对不上直接返回False整个函数结束如果两者不相等括号配对失败 →return False直接结束程序。如果两者相等配对成功什么都不做继续循环。注意配对成功的时候没有 return直接往下走继续处理下一个字符。错误样例 s( ]初始stack [?]第一轮 c(append栈[?,(]第二轮 c]]不在 dic 的 key进入分支top_char stack.pop() # top_char(栈变为 [?]match_right dic[top_char] # match_right )if match_right ! c: # ) 和 ] 不相等条件成立return False # 直接返回False函数结束5. 本题用到的 Python 基础知识总结知识点是什么本题中的作用self类方法第一个固定参数必须写表示这个对象自己dict{ }字典键值对{key: value}存左括号→右括号对应关系list列表可变序列当栈用append()入栈pop()出栈append()列表末尾添加左括号压入栈顶pop()删除并返回末尾元素取出栈顶进行匹配in成员判断判断字符是否在字典的 key 里len()返回长度判断栈是否只剩初始的?return返回结果不匹配提前返回 False最后返回判断结果6. 易错点提醒易错点错误示范正确做法原因空栈 pop 报错stack []后直接pop()stack [?]字典加?:?输入以右括号开头时空列表 pop 会崩溃遍历完直接返回 True最后写return Truereturn len(stack) 1输入(((全是左括号不会触发 False但栈里有残留字典写反dic {): (}dic {(: )}key 必须是左括号因为遇到左括号要入栈直接比较栈顶和 cstack.pop() cdic[stack.pop()] ! c栈里存左括号c 是右括号不能直接比
返回列表