题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
我的答案:
class Solution:
def isValid(self, s: str) -> bool:
res_bool = True
# 是奇数,肯定不对嘛
if (len(s)%2 != 0):
res_bool = False
length = len(s)
for i in range(length):
if '()' in s:
s = s.replace('()', '')
if '[]' in s:
s= s.replace('[]', '')
if '{}' in s:
s= s.replace('{}', '')
if (len(s) != 0):
res_bool = False
return res_bool
今天这个是easy难度,比昨天的简单多啦!我的方法就是,一个一个找括号对,找到了就去掉,最后看剩下的字符串是不是为空就好啦!
参考答案:
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
哎呀,思路跟我是一样的,不过简化了好多呀。
直接使用while就可以啦!
堆栈法:
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
pairs = {
")": "(",
"]": "[",
"}": "{",
}
stack = list()
for ch in s:
if ch in pairs:
if not stack or stack[-1] != pairs[ch]:
return False
stack.pop()
else:
stack.append(ch)
return not stack
-
官方解用到了堆栈的方法,就是一个一个入栈,匹配上了就出栈,最后判断是否为空。
-
注意一下:存进堆栈的是左括号,字典存的是
右括号:左括号
。因此遍历的时候,来一个左括号就放进堆栈,来一个右括号就检查最上面的是不是对应的左括号。 -
如果配对成功,就
pop
,失败就返回false。很巧妙的方法呢! 不过个人觉得第一种方法更好理解一些吧~
新知识:
- 字符串不能删除指定元素,只能使用
strip()
去除首尾元素,或者使用replace('{}','')
替换成空值。 - 字典
if ch in pairs
,这里的判断指的是key