第十二届蓝桥杯Python程序设计赛A组J题_括号序列

  • 有点类似leetcode.301题,删除无效括号
  • 此题也可以使用DFS,但是因为题中好像有一句最少增加,所以考虑使用BFS,一层层遍历,直到存在有效括号
  • 代码:
MOD = 10000007 # 几个零忘了
s = input()
level = {s}  # 为了去重,考虑使用集合来存储每一层的字符串
def isValid(string):  # 来判断某个字符串里面的括号是否有效
    count = 0
    for si in string:
        if si == '(':
            count += 1
        elif si == ')':
            count -= 1
        if count < 0:  # 这里要用if,比赛时第一次写成了elif,调了半天
            return False
    return count == 0
    
while True:
    Valid = list(filter(isValid, level)) # filter(func, param)作用是对可迭代对象param中所有满足函数func的结果进行返回,满不满足是通过func返回true还是false来判断的 
    if Valid: # 如果Valid不为空,说明已经有了有效字符串,直接返回结果即可
        print(len(Valid) % MOD)
        break
    next_level = set()  # 同样的将下一层也选择集合这个数据结构
    for item in level:  # 遍历这一层中的所有字符串
        for i in range(len(item)+1):  # 遍历每个字符串的所有位置,这里len(item)要加一,因为当i=len(item)时,相当于在最后一个位置添加括号
            # 注意下面插入括号的时候不用考虑插入括号后的字符串合不合法,加它就完事了,后面交给isValid去判断(渣男行为)
            next_level.add(item[:i] + '(' + item[i:])  # 插入一个左括号
            next_level.add(item[:i] + ')' + item[i:])  # 插入一个右括号
  • 记得当时是能够运行出结果的,但是时间复杂度来不及考虑了,望路过的大佬指正!!!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泛古玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值