开始之前:从2018/8/27开始刷LeetCode,计划每周刷五题,周末进行总结并发布在csdn上,计划先刷150道题,从简单开始。
week 2-1
要求:
CODE:
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
dic = {'(':')', '[':']', '{':'}'}
stack = [] # 创建一个空的列表用作堆栈
# 极端情况
if not s: # 空string应该算是关系对应正确的吧 嗯大概
return True
if len(s) % 2 != 0: # 长度不是偶数必然不对应
return False
if s[0] not in dic:
return False # 第一个必须是左括号不然关系一定错误
dic = {'(':')', '[':']', '{':'}'}
stack = [] # 创建一个空的列表用作堆栈
for c in s: # 对string中每一个字符进行遍历
if c in dic:
stack.append(dic[c]) # 如果当前字符属于左括号则将对应的右括号加入stack
else:
if c != stack.pop(): # 如果是右括号则比较是否与最新存入的括号作比较
return False # 如果不相等返回False
if not stack: # 最后所有的左括号都被pop了证明每一个都找到了对应关系
return True
else:
return False # 否则说明关系不对
结果:
知识点:
1. 想要运行速度提升,可以在循环开始前多加判断分支
2. 实际上利用了堆栈思路,栈:先进后出
可以这么来考虑这个问题:想要对应关系正确的话,和一个右括号最近的左括号一定要是对应的关系,否则不对。
注意,最后stack一定要全部pop out了才证明所有的左括号都找到了对应的右括号。