[LeetCode]20-有效的括号

20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: "{[]}" -> true
输入: "([)]" -> false

解法1

用字典来存储括号对, 用Stack来记录遍历字符串的结果, 左括号入栈, 有对应的右括号就出栈
示例代码

class Solution:
    def isValid(self, s):
        if s is None or len(s) == 0:  #排除异常情况, 字符串为空时返回True
                return True
        if len(s)%2 == 1:  #排除异常情况, 字符串为奇数时返回False
            return False
        bracket = {'(':')','{':'}','[':']'}  #把括号一一对应存入字典
        stack = []
        for each in s:  
            if each in bracket:  #遍历字符串, 发现左括号入栈
                stack.append(each)
            else:  #不是最括号的情况
                if not stack or each != bracket[stack.pop()]:
                    return False  #栈空, 即不是以最括号开头或不是从最后一个开衫对应, 返回False
        return stack == []   #一一对应出栈则说明是有效括号

解法2

依然是最括号入栈, 有对应的右括号出栈, 相当于是简化版
示例代码:

    def isValid(self, s):
        a = {')':'(', ']':'[', '}':'{'}  #右括号对应最括号的字典
        l = [None]  #设置None排除空值的情况
        for i in s:
            if i in a and a[i] == l[-1]:
                l.pop()  #右括号, 且与最后一个最括号对应, 出栈
            else:
                l.append(i)  #左括号入栈
        return len(l)==1

你可能感兴趣的:([LeetCode]20-有效的括号)