题目描述:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
思路一:
(1)分别用三个int型的标志变量small,mid,large分别记录( ),{ },[ ]三种括号的排列情况,初始为0。
(2)遍历字符串,遇到’( { [‘就对相应的标志变量+1,遇到’) } ]‘就对相应的标志变量-1。
(3)为了避免对类似于’)))(((‘和’}}{{'的括号左右顺序错误情况误判为正确,在每一次做完加减法后都需要加一个判断,如果small、mid、large三个变量中出现一个负值,代表该字符串一定出现了左右顺序错误,直接返回False。
(4)遍历完成后,如果small、mid、large三个变量均为0,则说明每一个括号都匹配成功,返回True,否则一定有“有左五右”的错误情况,返回False。
代码如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
small = 0
mid = 0
large = 0
for symbol in s:
if symbol == '(':
small += 1
elif symbol == ')':
small -= 1
elif symbol == '{':
mid += 1
elif symbol == '}':
mid -= 1
elif symbol == '[':
large += 1
elif symbol == ']':
large -= 1
if small < 0 or mid < 0 or large < 0:
return False
if small == 0 and mid == 0 and large == 0:
return True
else:
return False
提交后出现了错误:
其实看到这个用例,思路的漏洞已经很明显了,两个符号出现了部分嵌套的问题,从常识上可以判断这是不合理的,需要对算法进行调整。
思路二(更正思路一):思来想去,感觉还是用栈方便快捷,思路如下:
(1)建立括号之间的匹配字典,以及空的栈。
(2)遍历字符串,遇到左边的括号就压入栈,遇到右边的括号就查看栈顶的元素,如果匹配,就pop出,如果不匹配,把右边的括号也压入栈。
(3)最后看栈是否为空,若为空,返回True,否则返回False。
代码如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
dic = {')':'(','}':'{',']':'['}
stack = []
for char in s:
if char in dic and stack and stack[-1] == dic[char]:
stack.pop()
else:
stack.append(char)
return not stack
执行用时如下,还不错: