• 20. 有效的括号-栈的应用


    20. 有效的括号

    给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
    3. 每个右括号都有一个对应的相同类型的左括号。

    示例 1:

    1. 输入:s = "()"
    2. 输出:true

    示例 2:

    1. 输入:s = "()[]{}"
    2. 输出:true

    示例 3:

    1. 输入:s = "(]"
    2. 输出:false

    提示:

    • 1 <= s.length <= 104
    • s 仅由括号 '()[]{}' 组成

    解题思路

    当开始接触题目时,我们会不禁想到如果计算出左括号的数量,和右括号的数量,如果每种括号左右数量相同,会不会就是有效的括号了呢?

    事实上不是的,假如输入是 [{]},每种括号的左右数量分别相等,但不是有效的括号。这是因为结果还与括号的位置有关。

    仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,比如 {()[()]} 是一个有效的括号,()[{}] 是有效的括号,[()] 也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。比如下面的例子。

    这个思考的过程其实就是栈的实现过程。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。

    实现代码:

    1. class Solution:
    2. def isValid(self, s: str) -> bool:
    3. stack = []
    4. dic = {')':'(',']':'[','}':'{'}
    5. for i in s:
    6. if(stack and i in dic):#i in dic表示, i在{')',']','}'}范围内
    7. if(stack[-1] == dic[i]):#当栈顶字符和i遍历到的字符配对时
    8. stack.pop()#弹出栈顶元素
    9. #每当匹配到{')',']','}'}时,该位置的左侧必然会一个能匹配的字符,否则匹配不成功
    10. else: return False
    11. else:
    12. stack.append(i)
    13. return len(stack) == 0

    参考:力扣 

    下面还有一个更加简单的做法:

    就先找到那个最小的能够匹配字符串,然后用空字符('')把它替换掉,接着再在新的字符串里找能都匹配的最小字符串,再用''把它替换掉,如果到最后最初的字符串变成空字符'',那么就说明是有效的括号。

    1. class Solution:
    2. def isValid(self, s: str) -> bool:
    3. while('[]' in s or '{}' in s or '()' in s):
    4. s = s.replace('[]', '')
    5. s = s.replace('{}', '')
    6. s = s.replace('()', '')
    7. return s == ''

  • 相关阅读:
    微服务框架 SpringCloud微服务架构 21 RestClient 操作文档 21.5 批量导入文档
    【无标题】
    Webpack介绍大全
    拓端tecdat|R语言时间序列分解和异常检测方法应用案例
    【解包裹】基于GPSA和AIA实现相位提取附matlab代码
    《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(9)-Charles如何修改请求参数和响应数据-上篇
    Docker实战之二
    一文学会设计模式
    Vue3实现刷新页面局部内容
    遇到这3种职场变化,趁早为自己打算
  • 原文地址:https://blog.csdn.net/wangjian530/article/details/127772537