RounieJane

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。

posted on 2020-08-19 09:59  RounieJane  阅读(273)  评论(0编辑  收藏  举报

导航