20. 有效的括号
难度简单2765
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true示例 2:
输入:s = "()[]{}" 输出:true示例 3:
输入:s = "(]" 输出:false示例 4:
输入:s = "([)]" 输出:false示例 5:
输入:s = "{[]}" 输出:true提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
通过次数834,613提交次数1,874,359
我的解题思路:
- 利用堆栈的思想,遇见左括号就要加入堆
- 遇见右边括号就匹配
- 匹配成功就出堆
- 匹配不成功就返回错误
- 其中要注意的是:匹配的时候要判断堆里面有没有元素,如果没有就返回错误
我的代码:
class Solution:
def isValid(self, s: str) -> bool:
ls_symbol = ['(', '{', '[']
ls_symbol_re = [')', '}', ']']
stack = []
t = -1
s_len = len(s)
#开始遍历
for i in range(s_len):
#如果是左括号,则添加到堆
if ls_symbol.count(s[i]) == 1:
stack.append(ls_symbol_re[ls_symbol.index(s[i])])
t += 1
#如果不是左括号 ,就进行比较(注意要判断是否出现指针越界的情况),如果比较有匹配,就成功
elif t >= 0 and s[i] == stack[t]:
t -= 1
stack.pop()
# 如果不是左括号 ,就进行比较(注意要判断是否出现指针越界的情况),如果比较没有有匹配,就失败
elif t >= 0 and s[i] != stack[t]:
return False
#指针越界,则是非法匹配
elif t < 0:
return False
if t >= 0 :
return False
return True
总结:
代码很简单,但是还是一句话,容易粗心,总结了以下几种原因:
- 不熟练
- 逻辑不清晰
解决方法:
- 写代码要注释
- 注释要考虑各种分支可能存在情况之后再编码



