008-力扣刷题20--有效的括号

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

有效字符串需满足:

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

示例 1:

输入: "()" 输出: true 示例 2:

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

输入: "(]" 输出: false 示例 4:

输入: "([)]" 输出: false 示例 5:

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
    #还是使用字典数据结构
        stack=[]  #这个stack存储的是左边的括号
        lookup  = {"(":")","[":"]","{":"}"}  #首先定义一个字典的映射,将各种括号进行对应
        for parenthese in s: #对s进行遍历
            if parenthese in lookup: #如果说输入的括号是左括号,那么在字典中
                stack.append(parenthese) #就将左括号添加到stack这个列表中去
            elif len(stack)==0 or lookup[stack.pop()] != parenthese:
                #or 后面的意思很好理解当我们取出的parenthes是右括号时,那么它的前一个元素对应的一定是对应的左括号,否则就是错的  比如(],()(}都是不能对应的,这个地方仔细研究就懂了,只要是第一个出现的右括号前面上一个 出现的一定得是对应的左括号不然就是错的.  
                # or 后面的是这种情况 ) 只出现了一个) 或者第一次出现的就是右括号,那么stack中是空的,也认为是错的
                return False

        return len(stack) == 0   #这一种情况考虑的是 只出现了一个 [  那么此时stack中只会存储一个 [  就完事了,但是这种情况是错的.
    #为什么这个最后判断使用的stack的长度呢,这是因为我们在elif判断左右括号的时候是用了弹出元素的方法,最后左括号和右括号数量相等的情况下,stack中的元素最终会全部被弹出
    #就会返回True
     #比如 () []
    # stack=['(' ]
    #stack=[] pop操作
    #stack=[[]
    #stack=[] pop操作