【leetcode】20. 有效的括号
描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
输入: "()" 输出: true
输入: "(]" 输出: false
思路
栈
一般这种匹配问题都是用栈来实现的。
有效括号表达式的子表达式也应该是一个有效表达式,其中最小的有效表达式,是两个匹配括号的最小有效表达式。
在leetcode的官方题解中(leetcode的官方题解都不错)这样描述:颜色标识的单元格是开闭的括号对。整个表达式是有效的,它的子表达式本身也是有效的。这位问题提供了一种递归结构。
谈到递归,一般都可以用栈的思想去解决,即从外部到内部。
算法
- 初始化栈 S。
- 一次处理表达式的每个括号。
- 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
- 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个
相同类型的
左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。 - 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
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,一般来讲速度就这么提上去的。
这个算法的主要问题是可读性,如果写的不好读起来很痛苦。