1. 题目描述
2. 代码
1 class Solution: 2 def isValid(self, s: str) -> bool: 3 n = len(s)#获取字符串的长度 4 if n == 0:#如果长度为0,则表示空串,本题认为是合法的串 5 return True 6 if n % 2 == 1:#如果是奇数个括号,则必然不合法 7 return False 8 stack = []#定义一个列表用来模拟栈 9 for c in s:#循环字符串中的每个字符 10 if c == '(' or c == '{' or c == '[':#如果是左括号 11 stack.append(c)#直接入栈 12 elif c == ')':#如果是右括号 13 if len(stack) > 0:#栈不为空 14 if stack[-1] == '(':#栈顶元素是对应的左括号 15 stack.pop(-1)#目前合法,则将栈顶出栈 16 else: 17 stack.append(')')#栈顶元素无法匹配,则当前右括号入栈 18 else:#栈为空,则无法匹配 19 return False 20 elif c == '}': 21 if len(stack) > 0: 22 if stack[-1] == '{': 23 stack.pop(-1) 24 else: 25 stack.append('}') 26 else: 27 return False 28 elif c == ']': 29 if len(stack) > 0: 30 if stack[-1] == '[': 31 stack.pop(-1) 32 else: 33 stack.append(']') 34 else: 35 return False 36 if len(stack) == 0:#如果栈可以左右都匹配(成对消除) 37 return True#则是合法串 38 else: 39 return False
思路:
1.左右匹配, 就相当于1进1出, 最后栈的长度为0, 返回真.
2. 如果都不匹配, 就都入栈, 最后栈的长度不等于0, 返回false.
3. 如果是示例5, 就是先 { 和 [ 入栈, 然后第3个 ] 的时候匹配了栈的-1个元素, 所以就移除, 最后一个 } 也是同样的道理.
3.整理
3.1 列表
1 list1 = ['Google', 'Runoob', 1997, 2000] 2 list2 = [1, 2, 3, 4, 5 ] 3 list3 = ["a", "b", "c", "d"] 4 list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
3.2 元组
1 tup1 = ('Google', 'Runoob', 1997, 2000)
3.3 栈, 后进先出.
list模拟栈,进入顺序0 1 2 3,出栈顺序3 2 1 0
list(-1)表示栈顶元素.