给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
class Solution():
def isValid(self, s: str):
left_str = ['(', '{', '[']
right_str = [')', '}', ']']
stack = []
for ch in s:
if ch in left_str:
stack.append(ch)
elif ch in right_str:
if len(stack) <= 0:
return False
if left_str.index(stack.pop()) != right_str.index(ch):
return False
return len(stack) == 0
第一次使用leetcode编辑代码,使用过程充满坎坷,本人从c/c++转python学习,对功能强大的python语言也只是略知皮毛。在以前的学习中好像也没有接触到比较系统的学习,看到力扣大神各种秀代码,我只能惊呼666!自己需要学习的东西还是太多了,好吧,话归正题,第一次看到这种题有些懵逼,看到大家用什么栈操作,对于没有数据结构基础的我来说真是如阅天书。我自己的理解是:1、括号数必为偶数,才能保证两两匹配,所以首先看len(chars)能不能被2整除,2、若能被2整除,有匹配的可能,再看匹配的顺序是否正确,因为涉及到括号的嵌套,我仔细想了下,按照从左到右的顺序,可分为一个或多个嵌套括号块,每一个括号块都是从左小、中、大括号开始,最内层的括号肯定相邻,但是如何知道每个嵌套括号块最内层的配对括号就成了关键,这样我可以针对每个括号块进行一一配对(用列表索引可不考虑嵌套方式),如果每个括号块都能匹配成功则最终返回True,但是我怎么去区一一匹配呢?
后来经过大神指点和对别人代码的参考,充分利用了list的index、pop实现了配对操作!
list函数 | 释义 |
---|---|
list.index(obj) | 返回obj与list匹配项的索引位置 |
list.append(obj) | 返回obj与list匹配项的索引位置 |
list.pop(n) | 移除列表中的第n项元素,并返回该元素值,default=-1 |
左小、中、大括号和右小、中、大括号按照对应位置分别组成两个list。一个正确的括号排序肯定是:每一个括号块最内层嵌套的左小、中、大括号能与对应右括号配对,所以使用两层if-else分支,一层是通过不断append左括号来确定最小内嵌层,如果匹配正确,则从左到右每遍历一个右括号都能与前一个左括号匹配,并pop掉。最后stack能全部pop(配对)则返回True,否则匹配存在无效的括号!