- 题目描述
给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
- 示例
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
- 解决方案
本想自己解决,但是用了一堆if else的判断最后把自己都快搞疯掉也不能AC,看了网上的解决方案,意识到自己的问题在于老想着用最笨的方法去遍历记录,对数据结构的理解、掌握和应用不到位,效率低,效果差。
参考的解决方案使用的思路是用栈的数据结构来解决,如果当前字符是左括号,则直接放入栈中,如果是右括号,那么就判断此时栈里的字符是否是与之对应的左括号,如果不是的话则返回False,要注意如果此时栈是空的,也是返回False。
另外需要注意的是有可能会出现字符串中只有左括号的情况,栈不为空,但是返回的是False。一开始做的时候没有考虑到这个,报错了。
- 代码
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
l = len(s)
if l ==0 :
return True
#如果字符个数为奇数,直接返回False
elif l%2 ==1:
return False
d = {'(':')','[':']','{':'}'}
#栈
stack = []
for i in s:
#如果当前字符为左括号,则直接加入栈中
if i in d:
stack.append(i)
#如果当前字符为右括号
else:
if not stack:
return False
else:
#判断当前栈中是否有与当前右括号相匹配的左括号
if d[stack.pop()] != i:
return False
#之所以判断栈此时是否为空,是要考虑字符串是'(('的情况
if stack == []:
return True
else:
return False