7-3 有效括号判断 (30 分)

29 篇文章 19 订阅

这个题呢,来自于力扣,在本周的蓝桥杯训练里也看见了这道题,我认为这道题的复杂程度要高于蓝桥杯训练,所以我把蓝桥杯训练拿出来了,咱们先分析蓝桥杯训练,然后再引出不同点。


前题:

括号()的组合千奇百怪,Drizzle 想知道各种组合的括号可以是否合法
合法要求:每个同类型的左括号必须有与之对应的同类的右括号以正确的顺序闭合

要求:

输入:输入一个括号字符串 输出:输出是否合法,是则True,否则False

示例:

输入:

(){}[]

结尾无空行

输出:

True

结尾无空行

范围:

对于 100% 的数据:括号字符串长度 ≤ 100

思路:

第一,我们要明白这个的考点在什么,非常简单,即栈的操作

所以,我们只需要一个列表,然后顺序读取括号,把左括号依次放进去,如果是右括号时,判断是否为一种括号,如果是,移除左括号。即可

代码如下:

def op(str1: str):
    str2 = []
    for i in str1:
        if i == '(' or i == '[' or i == '{':
            str2.append(i)
        elif i == ')':
            if str2[len(str2) - 1] != '(':
                return 0
            else:
                str2.pop()
        elif i == ']':
            if str2[len(str2) - 1] != '[':
                return 0
            else:
                str2.pop()
        elif i == '}':
            if str2[len(str2) - 1] != '{':
                return 0
            else:
                str2.pop()
    return 1

所以其实难度并不高

然后补全基础代码即可,下面是完整答案

答案:

# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/10/16 18:58
def op(str1: str):
    str2 = []
    for i in str1:
        if i == '(' or i == '[' or i == '{':
            str2.append(i)
        elif i == ')':
            if str2[len(str2) - 1] != '(':
                return 0
            else:
                str2.pop()
        elif i == ']':
            if str2[len(str2) - 1] != '[':
                return 0
            else:
                str2.pop()
        elif i == '}':
            if str2[len(str2) - 1] != '{':
                return 0
            else:
                str2.pop()
    return 1


str1 = input()
if op(str1):
    print('True')
else:
    print("False")

复杂化:

Alan最近眼神不好使,经常分不清楚括号,所以想请你帮忙,给定一个只包括 '(',')','{','}','[',']' 的字符串,想让你帮忙编写程序确定括号是否都是正常闭合。

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 空字符串被认定为True

输入格式:

输入空字符串或一行只包含'(',')','{','}','[',']' 的字符串。

输出格式:

如果所有括号正确闭合,输出“True”,否则输出“False”。

输入样例:

在这里给出一组输入。例如:

()

结尾无空行

输出样例:

在这里给出相应的输出。例如:

True

结尾无空行

输入样例:

在这里给出一组输入。例如:

{[()]()}

结尾无空行

输出样例:

在这里给出相应的输出。例如:

True

结尾无空行

输入样例:

在这里给出一组输入。例如:

{{()[]}

结尾无空行

输出样例:

在这里给出相应的输出。例如:

False

结尾无空行

思路:

这个和上面那个有什么区别呢?

毫无疑问在“空字符串被认定为True

所以我们只需要运用我们非常熟练地判断(try:......except:......):

代码如下:

try:
    str1 = input()
    if op(str1):
        print('True')
    else:
        print("False")
except :
    print('True')

这样我们需要运用前题的思路补全函数即可。

下面为完整答案

答案:

# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/10/18 20:17
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/10/16 18:58
def op(str1: str):
    str2 = []
    if str1.count('(')!=str1.count(')') or str1.count('[')!=str1.count(']') or str1.count('{')!=str1.count('}') :
        return 0
    for i in str1:
        if i == '(' or i == '[' or i == '{':
            str2.append(i)
        elif i == ')':
            if str2[len(str2) - 1] != '(':
                return 0
            else:
                str2.pop()
        elif i == ']':
            if str2[len(str2) - 1] != '[':
                return 0
            else:
                str2.pop()
        elif i == '}':
            if str2[len(str2) - 1] != '{':
                return 0
            else:
                str2.pop()
    return 1

try:
    str1 = input()
    if op(str1):
        print('True')
    else:
        print("False")
except :
    print('True')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值