题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 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。