Leetcode 20 Valid Parentheses

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

题意分析:
判断一个括号字符串是否合法,在这道题中需要满足:

  1. 每个左括号都需要有一个对应的右括号与其对应
  2. 在一对合法括号里面的括号,也需要是合法的(见示例4,5)

思路分析:
leetcode之后还会有很多这种判断括号合法的问题,这种题目通常都是使用来解决的。
基本思路为:
左括号来了就进栈,右括号来了就看栈顶元素是否匹配,匹配就出栈,继续分析下一个括号,最后观察栈是否为空(确保没有多余的左括号!)

而这道题需要做一点小小的改动,那就是右括号来的时候,我们需要判断站定的元素是否为对应括号的左括号(因为这里有三种括号类型),用一个字典存了每个右括号对应的左括号,这样就可以少写一点if条件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 24ms, beats 79.66%
class Solution(object):
def isValid(self, s):
stack = []
d = {')':'(', ']':'[', '}':'{'}
for ss in s:
if ss in '([{':
stack.append(ss)
else:
if not stack or stack[-1] != d[ss]:
return False
stack.pop()
return len(stack) == 0