Leetcode高频100题刷题记录之——有效的括号
1 思路分析
这题比两数求和感觉更加简单(当然两数求和用哈希表的方法也很简单)。思路非常直观,用栈”先进后出“的思想可以非常容易地得到答案。
符号定义:“s”:题目中输入的字符串;“staging_list”:预先定义的一个空表,用来暂存数据
Step1:将字符串转化成ASCII码的形式,本题的六个字符串如下:
符号 | ASCII码 | 符号 | ASCII码 |
---|---|---|---|
( | 040 | ) | 041 |
[ | 091 | ] | 093 |
{ | 123 | } | 125 |
遍历s中的所有字符:
Step2:判断staging_list[-1]是否是空表,若是,转Step4;
Step3:遍历s中的所有字符,判断表中最后一个字符staging_list[-1]与当前字符si之间的差值si-staging_list[-1]是否处于[1, 2]区间内,若是,转Step5,否则转Step4;
Step4:将si插入staging_list的末尾(入栈);
Step5:将staging_list中最后一个字符删除(出栈);
Step6:判断staging_list是否是空表,若是,返回"True",否则返回"False"。
2 代码实现
附上python代码版本:
class Solution:
def isValid(self, s: str) -> bool:
'''
ASCII码表:
'(': 040; ')': 041;
'[': 091; ']': 093;
'{': 123; '}': 125;
'''
s = [ord(si) for si in s] # 将字符串转换为ASCII码
staging_list = [] # 定义一个空表,用来暂存括号
for si in s:
if len(staging_list) == 0: # 判断是否为空表,若是,将s中的当前值加入表中
staging_list.append(si)
elif (0 < (si - staging_list[-1]) < 3): # 后一个括号与当前最后一个括号互相匹配
staging_list.pop() # 括号已匹配,删除
else:
staging_list.append(si)
if len(staging_list) > 0:
return False
else:
return True