有效的括号
兄弟们,有效的括号这一题个人认为主要是理清楚可能出现的错误情况
首先假设只有一种括号 ( )
这样可能出现的情况有如下:
1.左括号多了
2.右括号多了
首先我采取的是栈的方法,通过循环将单个的括号拿出来,遇见左括号入栈,遇见右括号进行比较.
这样如果在循环中遇见右括号进行比较,如果栈为空说明右括号多了,如果不为空就直接删除就行
当循环结束,即所以括号被遍历完,再次对栈进行一个判断.若为空,就是说左括号,和右括号的数量刚刚好,括号就为有效括号.栈不为空则左括号多了.
代码我懒得写了
现在假设括号变为 ( [ { } ] )
除了上述可能出现的问题多了一种,就是说 左右括号 是否配对的情况,若为(}
肯定不为有效括号,如何判断呢?
有一种比较巧妙的方式,查下标
左括号 右括号
def panduan(c_kuohao,d_kuohao):
#这个是用来比对,判断出栈元素与当前元素是否成对
zuo='([{'
you=')]}'
if zuo.index(c_kuohao)==you.index(d_kuohao):
return True
else:
return False
下面是主体代码,加判断代码
def fun(kuohaos):
#建栈
stack=[]
#首先循环进行比对
for kuohao in kuohaos:
if kuohao in '([{':
#说明是左括号,入栈准备比对
stack.append(kuohao)
else:
#说明是右括号,需要对栈中是否有左括号进行判断,以防右括号多了
if stack==[]:
#有右括号,但是没有左括号了
return False
else:
pop_kuohao=stack.pop()
if not panduan(pop_kuohao,kuohao):
#没有对应上进来,如果对应上了就继续循环
return False
if stack==[]:
#说明左括号没有多
# 在循环中所以可能的错误都没有发生,所以为True
return True
else:
return False
#其实如果字符串不是长度不是偶数,那么一定不能配对成功,可以减少代码量
是我愚蠢了
算法分析:在空间上主要的消耗是 入栈所占用的空间为o(n),时间上的消耗则是拿出所有括号的o(n)
第二种的优化方法,哈希表实现panduan函数
def panduan(zuo,you):
dic={'(':')','{':'}','[':']'}
if dic[zuo]==you:
return True
else:
return False
每一次比对均为o(1)操作,一些微小的提升罢了