题目
难度:简单
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路
解决这个题目有两个点:
- 使用
栈
保存遍历过的未匹配的括号 - 左右括号匹配,这个比较简单
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if not s: return True
# 以字典保存每个括号,左括号为正值,右括号为负值,匹配的左右括号值相加为0
d = {
'(': 1, ')': -1,
'[': 2, ']': -2,
'{': 3, '}': -3
}
stack = []
for c in s:
# 检查括号值为正值,即左括号,压栈。 否则为右括号
if d[c] > 0:
stack.append(c)
else:
# 1. 当前为右括号时,栈为空,即无匹配括号,返回False
# 2. 当前括号与栈顶括号的值相加不等于0,即括号不匹配, 返回False
if not stack or (d[stack[-1]] + d[c] != 0):
return False
else:
# 否则弹栈
stack.pop()
# 遍历完后,检查栈应该为空,返回True, 否则即有括号未匹配,返回False
return not stack
执行情况
时间复杂度
时间复杂度:O(n)