python多重if_codewars(python)练习笔记十五:判断多重括号的平衡性

codewars(python)练习笔记十五:判断多重括号的平衡性

题目

Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it's invalid.

This Kata is similar to the Valid Parentheses Kata, but introduces new characters: brackets [], and curly braces {}. Thanks to @arnedag for the idea!

All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.

What is considered Valid?

A string of braces is considered valid if all braces are matched with the correct brace.

Examples

"(){}[]" => True

"([{}])" => True

"(}" => False

"[(])" => False

"[({})](]" => False

题目大意:

给定字符串,判断字符串中,多重括号的平衡性。仅有 () {} [] ,没有其他字符串。

解题思路:

括号匹配的四种可能性:

①左右括号配对次序不正确

②右括号多于左括号

③左括号多于右括号

④左右括号匹配正确

算法思想:

1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;

2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;

3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;

4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;

5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;

6.正常结束则括号匹配正确。

我的解法:

#!/usr/bin/python

def validBraces(string):

temp = []

for item in string:

if item in ['[','{','(']:

temp.insert(0,item)

if item in [']','}',')']:

if len(temp) == 0:

return False

elif (item == ']' and temp[0] == '[') or (item == '}' and temp[0] == '{') or (item == ')' and temp[0] == '('):

temp.remove(temp[0])

else:

return False

if len(temp) != 0:

return False

else:

return True

简单的讲,就是遇见左括号,就入栈,遇见右括号:

1)先判断栈内是否有元素,没有则出现了先右后左,不平衡,返回 False

2)再判断栈顶元素是否与当前右括号匹配,若不匹配,返回 False,若匹配,删除栈顶元素,继续下一循环

最后,循环结束后,判断栈内是否有元素,有则说明左括号数量多于右括号,不平衡,不匹配。没有则说明左右平衡,返回True。

其他解法一:

def validBraces(string):

braces = {"(": ")", "[": "]", "{": "}"}

stack = []

for character in string:

if character in braces.keys():

stack.append(character)

else:

if len(stack) == 0 or braces[stack.pop()] != character:

return False

return len(stack) == 0

这个是利用了map ,简化了数据模型和分析过程。

其他解法二:

def validBraces(s):

while '{}' in s or '()' in s or '[]' in s:

s=s.replace('{}','').replace('[]','').replace('()','')

return s==''

利用左右括号的平衡性,最内的括号一定时左右相邻且平衡的。

问题描述:假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即CC或[([ ] [ ])]等为正确格式,[( ))或((()均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:    [ ( [ ] [ ] ) ]    1 2 3 4 5 6 7 8 当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号的出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的 第7个括号“]”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,…… ,依次类推。可见这个处理过程正好和栈的特点相吻合。 要求:设置一个栈,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入栈中,若是右括号,则或者是和当前栈顶的括号相匹配,或者是不合法的情况,输出“此串括号匹配不合法”。在初始和结束时,栈应该是空的。 测试数据:输入 #([ ]())#,结果“匹配”  输入 #[( )]#,结果“此串括号匹配不合法”  #为起始和结束标志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值