给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
涉及到括号、表达式等这一类的问题, 我们发现有个共同的特点是”最近相关性“ ,这类问题,使用栈来解决。
给定一组括号我们来判断是否能够有效的匹配
比较通俗的解法是,暴力搜索这一组括号, 遇到左括号入栈,遇到右括号,那么我们拿这个右括号跟栈顶比较,如果能匹配,那么目前为止,这组括号有效,如果不能匹配,直接返回false。
暴力搜索这组括号,如果遇到左括号入栈
遇到右括号,则跟栈顶来匹配,如果匹配, 则继续向后搜索, 并且栈顶元素出栈; 如果不匹配,那么很显然就不是有效括号了。
代码实现:
class Solution:
def isValid(self, s: str) -> bool:
stk = []
for c in s:
# 如果c是 ({[ 则入栈
if c in ['(','[','{']:
stk.append(c)
# 如果c是 )}] 并且栈不为空 则 判断栈顶是否为与之对应的左括号 是则出栈,不是则返回fasle
elif c == ')' and stk and stk[-1] == '(':
stk.pop();
elif c == ']' and stk and stk[-1] == '[':
stk.pop();
elif c == '}' and stk and stk[-1] == '{':
stk.pop()
else:
# 如果c是 )}] 栈为空 那么返回false
# 如果c是 )}] 栈不为空, 但是 栈顶不是与c对应的左括号 那么返回false
return False
# 例如"(){}[" ,如果最后栈不为空,那么就是有多余的左括号了
return not stk