题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
相关知识:
pop()函数:移除列表中的某个元素,默认为最后一个(出栈)
push:(进栈)
bool()函数:给定参数,转换为布尔值True or False
map(function,iterable)函数:批量映射函数,对序列中的元素做批量function中的操作
栈:先进后出(先进的被压在最下面,后来的在上面),python中可通过列表实现栈
图来源:栈和队列在python中的实现
思路:
将这些括号大体分成两种:左’[{(‘和右XX’]})’,做一个类比,相亲游戏:左括号这三种分别男生性格1,男生性格2,男生性格3,右括号这三种分别为女生性格1,女生性格2,女生性格3,每种性别都有三种不同的性格,相同性格的不同性别的人一一对应成双成对。现在你作为上帝,就要把男生性格1和女生性格1配对到一起[],男生性格2和女生性格2{},男生性格3和女生性格3()。我们规定按顺序出场(序列S);男生按顺序进房间(左括号),女生进入等待区;第一个出场的必须是男生,否则游戏结束(返回False);当有女生进入等待区时,马上让最后一个进入房间的男生出来,如果两人性格相同则配对成功,两人牵手离开;如果出来的男生和等待区的女生性格不合,则牵手失败,游戏结束(返回False);并且女生进入等待区后,若房间内没有男生,则游戏失败(返回False,这个情况说明,和他性格相同的男生可能在他的后面才会出现’}{’,或者根本没有出现’}’)。出场完毕,如果房间内还有男生,则有人落单,游戏结束(返回False)。
方法二:观察题目,无论是怎样的序列形式,其中必有一组成对的括号,’()’ ‘[]’ ‘{}’。我们做一个循环,找到这组括号并删除掉,继续循环,知道循环结束,序列中没有成对的括号了,此时如果序列为空,则返回True,否则返回False
class Solution:
def isValid(self, s): #s为男女生队列
'''
:type s:str
:rtype: bool
'''
stack = [] #男生房间
mapp = {'{':'}', '[':']', '(':')'} #游戏规定:性格匹配
for i in s: #按顺序出场
if i == '[' or i == '{' or i == '(': #第一个出场的必须是男生,男生出场则进房间
stack.append(i) #男生进房间
else: #女生进入等待区
if len(stack) == 0: #先看看房间内有没有男生
return False #房间内没有男生和这个等待区的女生匹配
else: #房间有男生
last = stack.pop() #最后一个进入房间的男生从房间出来,来到等待区
if mapp[last] != i: #查看性格是否匹配
return False #不匹配则游戏结束
#全部出场完毕,因为前面的规则是,有一组不匹配则游戏就结束,既然完成了for循环(全部出场),说明女生全部匹配成功,等待区没人。这个时候需要进屋看看,还有没有男生,有剩余男生的话,游戏结束。
if len(stack) != 0:
return False
else: #房间没人,等待区也没人,配对成功。
return True
#方法二:
class Solution:
def isValid(self, s): #s为男女生队列
'''
:type s:str
:rtype: bool
'''
while '[]' in s or '{}' in s or '()' in s:
s = s.replace('[]', '').replace('{}', '').replace('()', '')
if len(s) ==0:
return True