[LeetCode] 1249、移除无效的括号

题目描述

给你一个由 '('')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目'(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。

解题思路

堆栈模拟去除括号。

常规的判断括号字符串是不是合法的括号对的方法:**遇到左括号,则压入堆栈;遇到右括号,则判断堆栈是否为空;此时,如果堆栈为空,则字符串非法;反之,则弹出栈顶的左括号;最终遍历完字符串之后,如果堆栈非空,则字符串非法。**上面的算法有个特点,压入堆栈的一定都是左括号,右括号不会被压入堆栈。

然而这一题却不同,我们需要将非法的右括号同样也压入堆栈,在遍历完字符串之后,将堆栈内的括号全部从字符串中移除,得到的即为这道题的答案。最后查看堆栈的话,同样也可以发现一个特点,堆栈内的右括号一定是在左括号之前。(废话!如果左括号在前,不就左右配对消失了么)

注:string删除指定位置的字符可以这么操作:str.erase(tmpStack.top(), 1);

参考代码

class Solution {
public:
    string minRemoveToMakeValid(string str) {
        int length = str.size();
        if(length == 0)
            return "";
            
        stack<int> tmpStack;
        for(int i = 0; i < length; i++){
            if(str[i] == '('){
                tmpStack.push(i);
            }else if(str[i] == ')'){
                if(!tmpStack.empty() && str[tmpStack.top()] == '(')
                    tmpStack.pop();
                else
                    tmpStack.push(i);
            }
        }
        
        while(!tmpStack.empty()){
            str.erase(tmpStack.top(), 1);
            tmpStack.pop();
        }
        
        return str;
    }
    
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值