【leetcode】20. 有效的括号

   描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

 

示例

输入: "()"
输出: true

输入: "(]"
输出: false

 

思路

一般这种匹配问题都是用栈来实现的。

有效括号表达式的子表达式也应该是一个有效表达式,其中最小的有效表达式,是两个匹配括号的最小有效表达式。

在leetcode的官方题解中(leetcode的官方题解都不错)这样描述:颜色标识的单元格是开闭的括号对。整个表达式是有效的,它的子表达式本身也是有效的。这位问题提供了一种递归结构。

谈到递归,一般都可以用栈的思想去解决,即从外部到内部。

 

算法

  1. 初始化栈 S。
  2. 一次处理表达式的每个括号。
  3. 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
  4. 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
  5. 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

 

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if len(s) % 2 == 1:
            return False
        d = {')': '(', ']': '[', '}': '{'}
        l = [None]
        for i in s:
            if i in d:
                if d[i] == l[-1]:
                    l.pop()
                else:
                    return False
            else:
                l.append(i)
        return len(l) == 1

 

开始判断一下长度是否为奇数,可以过滤掉很多case,一般来讲速度就这么提上去的。

这个算法的主要问题是可读性,如果写的不好读起来很痛苦。

 

posted @ 2018-12-29 16:45  CRUD_boys  阅读(190)  评论(0编辑  收藏  举报