问题描述
给定一个只包括'(',')','{','}','[',']'的字符串,判定字符串是否有效。
有效字符串需满足:
- 左括号必须用想同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解题思路
之前没怎么刷过算法题,所以参考了下别人的代码,大致都是通过遍历字符串中的字符,首先将"(""{""["这三种字符压进栈,当遇到")""{""["这三种字符时,进行出栈操作,将出栈后的字符与遇到的字符做匹配,如匹配成功则算法继续运行,当匹配不成功时则退出算法返回False。
另外,在自己实现算法时发现经常需要判断栈是否为空,有时候栈不为空时却返回了字符串为正确的结果,在自己做题时还是需要注意到这些细节的。
具体代码
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
i = 0
stack = []
while i < len(s):
if s[i] == "[" or s[i] == "{" or s[i] == "(":
stack.append(s[i])
elif s[i] == "]" and stack: #判定栈是否为空
if stack[-1] == "[":
stack.pop()
else:
break
elif s[i] == "}" and stack:
if stack[-1] == "{":
stack.pop()
else:
break
elif s[i] == ")" and stack:
if stack[-1] == "(":
stack.pop()
else:
break
else:#这种情况是栈为空或者遇到其他符号
break
i += 1
if i == len(s) and not stack:#栈为空时才算正确
return True
else:
return False