题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路
空字符串可被认为是有效字符串;
而对于非空字符串,被判断为有效字符串的条件是括号都按相应顺序和类别互相匹配。因此,可以利用一个先进后出的栈,保存左括号的顺序和类别,从而按顺序进行左右括号两两配对,以判断括号的有效性。
算法描述如下:
- 字典d1保存右括号对应的左括号类型,d2用于判断括号为左括号还是右括号
- 利用栈来判断括号的闭合顺序
- 对于字符串中的每一个元素,进行4,5,6操作
- 首先判断是左括号还是右括号
- 对于右括号,分情况判断:
a. 若此时栈为空,则不符合括号闭合顺序,判定为无效的括号,跳到操作8
b. 若栈不为空,且当前栈顶元素为右括号对应的左括号,配对成功,将该左括号移出栈
c. 若栈不为空,且当前栈顶元素不是右括号对应的左括号,则配对不成功,判定为无效的括号,跳到操作8 - 对于左括号,直接压栈操作
- 若遍历完所有元素以后,栈为空,则说明括号都按相应顺序和类别,两两配对完了,则括号有效,跳到操作8
- 输出判定结果
解答
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
d1 = { ')':'(', '}':'{', ']':'['}
d2 = {'(': 1, ')': -1, '{': 1, '}': -1, '[': 1, ']': -1}
stack = []
isValid = False
i = 0
while i < len(s):
if d2[s[i]] == -1:
if stack == []:
break
elif d1[s[i]] == stack[-1]:
stack.pop()
else:
break
if d2[s[i]] == 1:
stack.append(s[i])
i+=1;
if i == len(s) and stack == []:
isValid = True
return isValid