• leetcode20之匹配括号


     题目描述:

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

    有效字符串需满足:


     左括号必须用相同类型的右括号闭合。
     左括号必须以正确的顺序闭合。


    注意空字符串可被认为是有效字符串。

    示例 1:

    输入: "()"
    输出: true


    示例 2:

    输入: "()[]{}"
    输出: true


    示例 3:

    输入: "(]"
    输出: false


    示例 4:

    输入: "([)]"
    输出: false

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-parentheses

    代码实现:

     1 def isValid2(s):
     2     '''
     3     借助栈来匹配括号
     4     :param s:
     5     :return:
     6     '''
     7     lookup = {"(": ")", "[": "]", "{": "}"}
     8     left = 0
     9     stack = []  # 定义数组,实现堆栈先进后出功能
    10     if len(s) % 2 == 0:
    11         while left < len(s):
    12             if s[left] in lookup:  # 为左括号,入栈
    13                 stack.append(s[left])
    14                 left += 1
    15             else:  # 为右括号,判断右括号与栈顶元素是否匹配
    16                 if stack:  # 栈不为空情况下
    17                     if lookup[stack.pop(-1)] == s[left]:  # 匹配成功
    18                         left += 1
    19                     else:
    20                         return False
    21                 else:
    22                     return False
    23     else:
    24         return False
    25     # return True if len(stack)==0 else False
    26     return not stack
    27 
    28 
    29 print("---测试isValid2(s)-------")
    30 s = "(()"
    31 print(isValid2(s))

    输出:

    ---测试isValid2(s)-------
    False

    总结:匹配括号,利用栈是个很好的选择。代码的实现思路是,从左到右遍历该括号组成的字符串,遇到一个左括号,压入栈中,遇到右括号,进行匹配。由于最开始遇到的右括号需要和最后遇到的左括号进行匹配,因此即匹配当前右括号和栈顶元素即可,若匹配成功,指针向右移动,循环上述步骤即可,直至所有括号都遍历完。若匹配不成功,直接返回False,结束循环。需要注意的是,匹配时栈顶一定要存在元素,如果栈顶不存在元素(说明在遇到该右括号之前没遇到左括号),返回False,结束循环,存在弹出元素进行匹配即可。很明显匹配的括号字符串长度肯定为偶数,若长度为奇数,直接返回False即可。完成上述匹配后,如果栈不为空,说明有剩余没匹配,返回False,反之返回True。

  • 相关阅读:
    this指针是什么?
    C++多态实现原理
    面试题2:实现Singleton模式
    面试题1:赋值运算符函数
    1.Two Sum
    朴素贝叶斯
    K近邻法
    感知机
    数据类型、用户交互、赋值运算
    蓝牙技术概述
  • 原文地址:https://www.cnblogs.com/rounie/p/13527605.html
Copyright © 2020-2023  润新知