删除不匹配的括号Python

题目:

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


题目


你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。如果答案正确会提示 It is a correct answer.
例如:“()”, “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。
没有括号的字符串(如:abcd)或空串 “” 也算一个括号匹配的字符串
你只能对原串进行括号删除的操作,其他操作将不被允许。
***

样例输入:
s = "a(b(c(de)fgh)"
样例输出:
"a(b(cde)fgh)"

提示:以下是本篇文章正文内容,下面案例可供参考

一、Python数组内置的push,pop是什么?

Push就是把数据压入数组(如果学了c语言就知道 是指向数组的指针前移一位即指针加1)
Pop就是把数据弹出数组(指向数组的指针后移一位即指针减1)
下面可以看看Push Pop是如何实现的

class MinStack(object):
    def __init__(self):
        self.stack = []

    def push(self, x):
        self.stack.append(x)

    def pop(self):
        if self.stack :
            self.stack.pop()

    def top(self):
        if self.stack:
            return self.stack[-1]

    def getMin(self):
        if self.stack:
            return min(self.stack)

stack = MinStack()
stack.push(-2)
stack.push(0)
stack.push(-3)
stack.push(5)
stack.push(-4)
print(stack.getMin())
stack.pop()
print(stack.top())
print(stack.getMin())

二、题目解答

1.思路分析

我对于括号删除问题也就是括号匹配问题的升级版(其实大体也是一样的)
首先分析s中括号情况

  1. s 是正常的左括号先在前,右括号在后,但是左右括号(相不相等无所谓)(),((()),((())))
  2. s 右括号先在前,左括号在后,)(),)))),

根据分析,我们可以定义两个空数组open_prclose_propen_pr对应的是处理第一种s的情况,close_pr处理的是第二种s的情况
第一种情况我们可以这么处理:
如果遇见左括号,我就push进入open_pr数组,遇见右括号我就从数组open_pr中pop出来
第二种情况的话:
我们可以把遇见左括号前的右括号全部push到数组close_pr中去,然后遇见左括号时就和第一种情况一样,按第一种情况处理
第一种和第二种出来的数组都是多余的不合理的括号

2.代码

代码如下(示例):

class Solution:
    def remove_parentheses(self, s: str) -> str:
        open_pr, close_pr = [], []

        s = list(s)
		#这里数组存储的是s字符串中不符合要求的括号的下标 以便后续删除
        for index, ch in enumerate(s):
        	#第一种情况
            if ch == '(':
                open_pr.append(index)
            elif ch == ')' and open_pr:
                open_pr.pop()
            #第二种情况
            elif ch == ')' and not open_pr:
                close_pr.append(index)

        for index in open_pr + close_pr:
        	#把不符合的括号全部删除
            s[index] = ""        

        return "".join(s) 
Solution().remove_parentheses('a(b(c(de)fgh)')
运行结果
"a(b(cde)fgh)"

总结

要先分清楚s的几种情况 是左括号先出现和右括号先出现两种情况
对两种情况分别处理
第二种情况:右括号先出现可以先记录右括号后按照第一种处理步骤处理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值