给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1
输入: “()”
输出: true
示例2
输入: “()[]{}”
输出: true
示例3
输入: “(]”
输出: false
示例4
输入: “([)]”
输出: false
示例5
输入: “{[]}”
输出: true
这里可以用到栈的特点:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
lis1=["()","[]","{}"]
lis2=[]
for i in s:
if not lis2 :
lis2.append(i)
elif (lis2[-1]+i)in lis1:
lis2.pop()
else :
lis2.append(i)
return lis2==[]
刚开始我没有注意到空字符也可以为true,结果在前面还判断了一下,画蛇添足了。
还可以用字典的对应关系:
class Solution:
def isValid(self, s: str) -> bool:
dic={'(':')','{':'}','[':']'}
lis1=[]
for i in s:
if lis1==[]:
lis1.append(i)
elif dic.get(lis1[-1])==i:
lis1.pop()
else:
lis1.append(i)
return lis1==[]
用字典的另一种思路:
class Solution:
def isValid(self, s: str) -> bool:
match_dict={'(':')','{':'}','[':']','?':'?'}
stack=['?']
for i in s:
if i in match_dict:stack.append(i)
elif match_dict[stack.pop()]!=i:return False
return len(stack)==1
这种思路就是:如果出现右半个括号,可以加入到stack中,否则判断 i 能不能和最后一个右括号组成一对,能则顺带删去右括号,否则返回False。若运行到最后,判断是否已将所有右括号删除干净。