1. 题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意:空字符串可被认为是有效字符串。
2. 解题思路
(1)法一:可用字符串的思路处理(参考leetcode讨论区代码)
(2)法二:借助栈进行处理,用栈处理这种基本方法还是要会的,基础知识要打劳,虽然代码量多一些,但是像第一种方法不是那么容易想到。
法二考虑多种情况:
- 当字符串为空串时,认为是有效字符串
- 当字符串元素个数为奇数时,有一个括号无法匹配,所以无效
- 当字符串的第一个元素不是左括号时,无效
- 其它情况:若字符为左括号,则入栈,意味着稍后处理;若遇到一个右括号,则检查栈顶元素,若相同类型,就把元素从栈顶弹出,若类型不相同,意味着无效,返回False
- 到最后,若栈中仍有元素,意味着无效,防止“{(”这种情况的出现
3.代码实现
法一(字符串):
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 == ''
法二(栈):
class Solution:
def isValid(self, s: str) -> bool:
left=['(','[','{']
right=[')',']','}']
complement=['{}','()','[]']
if s=="":#当字符串为空串时,认为是有效字符串
return True
#当字符串元素个数为奇数时,有一个括号无法匹配,所以无效;当字符串的第一个元素不是左括号时,无效
if (len(s)%2==1 or s[0] in right ):
return False
stack=[]
for item in s:
if item in left:
stack.append(item)
else:
combination=stack[-1]+item
if combination in complement:
stack.pop()
else:
return False
return stack==[]##最后需要判断最后的stack是否为空,因为可能出现全为左括号的情况