leetcode 301. 删除无效的括号

301. 删除无效的括号
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

说明: 输入可能包含了除 ( 和 ) 以外的字符。

示例 1:

输入: “()())()”
输出: ["()()()", “(())()”]
示例 2:

输入: “(a)())()”
输出: ["(a)()()", “(a())()”]
示例 3:

输入: “)(”
输出: [""]


这道题的问题是最小删除次数,所以这里优先选用 BFS.

  • 首先建立一个判断是否括号合法的函数,可以使用计数也可以使用栈。
  • BFS首先加入s到字符串集合中
  • 判断当前的集合内的字符串是否有合法的,如果有就提前返回
  • 如果没有就要考虑删除字符串的的一些括号,我们每一层的删除之后就传递给下一层,如果下一层还是没有合法的,就继续上一层的删除后的字符串继续删除。
  • 总的来说就是每一层对集合内的字符串,每一个字符串选择一个括号删除,所以一个字符串内有多少个括号,一个字符串就有多少个删除可能性,把每一个字符串的删除可能性加入到下一层的集合内部,放到下一层进行判断。

在这里插入图片描述

class Solution:
class Solution:
    def removeInvalidParentheses(self, s: str) -> List[str]:
        def isValid(s):#使用栈来判断是否合法
            stack = []
            for i in range(len(s)):
                if s[i] == '(':
                    stack.append('(')
                elif s[i] == ')' :
                    if stack:
                        stack.pop()
                    else:
                        return False
            return True if not stack else False


        level = {s}#建立第一个层级,这个层级没有删除元数
        # print(level)
        while level:#层次BFS
            res = []
            for s in level:#找这个层级内的合法字串
                if isValid(s):
                    res.append(s)
            if res != []: return res

            next_level = set()#创建下一个层级
            for s in level:
                for i in range(len(s)):
                    if s[i] in ['(',')']:#对当前层级的每一个字符串的每一个括号,进行删除后加入集合
                        next_level.add(s[:i]+s[i+1:])
            level = next_level#集合的赋值,变成当前集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值