本人一直在努力地积累Leetcode上用Python实现的题,并且会尽力讲清每道题的原理,绝不像其他某些博客简略地带过。
如果觉得讲的清楚,欢迎关注。
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
思路:一个很朴素的原则,后出现的左括号一定比在它之前出现的左括号先匹配到自己的另一半。那也就是说它很明显在提示我们用栈去储存我们的左括号。每当我们遇到一个右括号时,我们从栈结构中取出一个元素看它们是否匹配。这就是我们check的基本操作。
代码及其详细注释,(beat 55)
class
Solution
:
def
isValid
(
self
,
s
):
"""
:type s: str
:rtype: bool
"""
leftlist
=
[]
#左括号与右括号,注意相匹配符号的index也是匹配的
left
=
'{[('
right
=
'}])'
#因为s全是括号,所以我们直接遍历
for
i
in
s:
#是左括号,加进栈结构
if
i
in
left:
leftlist.append(i)
else
:
#遇到右括号,取出最近放入的左括号
if
len
(leftlist)
!=
0
:
if
left.index(leftlist.pop())
!=
right.index(i):
return
False
#取不出,说明有右括号多了
else
:
return
False
#当左括号不剩下多的,才true
if
len
(leftlist)
==
0
:
return
True
#否则false
else
:
return
False
反思易错:1.我们可以用python Builtin list 的 append pop 方法快速构建一个简易的栈
2.不光要考虑长得样子(形式)匹不匹配,还要考虑数量匹不匹配(右括号多了?还是左括号多了?)