每日一题:删除不匹配的括号

题目来源:LintCode
问题描述:你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。

例如:"()", “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。

输入样例:
输入:

string = ")a(b(c(de)fgh)))(("

输出:

"a(b(cde)fgh)"

题目分析:
采用循环遍历字符串,当遍历到"(“时,将其压入栈中保存;当遍历到”)“时,先判断栈是否为空,如果栈空,则删除此时的”)",若栈不为空,再判断栈顶元素是否为"(",如果是,则将"(“出栈,如果不是,则将”)“删除。遍历完整个字符串后查看栈中的元素,若栈空恰好满足情况,若栈中有元素,那么有多少个元素就需要在原字符串中删除多少个(例如:遍历完后栈中还有两个”(",说明原字符串中还有2个"("是多余的)。注意:最后删除时需要从右开始删除,否则会打破已经匹配好的括号。(可以先将字符串反转,然后用replace方法用空字符进行替换,起到删除的效果)

Python实现:

def bracketmatch(string):
    stack = []  #新建一个列表充当栈
    for s in string:
        if s == "(":
            stack.append(s)   # 对"("进行压栈
        elif s == ")":
            if stack == []:
                string = string.replace(')', '', 1)    # 判断栈空,删除")"
            elif stack[-1] == '(':
                stack.pop()  # 判断栈非空,将"("出栈
    if stack:  # 遍历完所有字符后栈非空
        string = string[::-1]  # 反转字符串
        string = string.replace('(', '', len(stack))  # 删除多余"("
        string = string[::-1]  # 还原字符串
    return string

结语:
第一次创作,入门级小白一枚,有不对的地方欢迎各位大佬指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值