301. Remove Invalid Parentheses(去除最少数量得无效括号)——todo

it’s hard to understand for me. I have to spend some time learning this solution.

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

注意: 输入字符串可能包含括号(和之外的字母)。

范例1:

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

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

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

思路:

code:

//利用计数器记录(数量与) 是否匹配。
class Solution {
    private:
        vector<string> res;
        string p={'(',')'};
        void helper(string& s, int si, int sj, int rev){
            int stn=0;
            for(int i=si;i<s.size();i++){
                if(s[i]==p[rev]) stn++;
                else if(s[i]==p[1-rev]) stn--;
                if(stn<0){
                    for(int j=sj;j<=i;j++){
                        if(s[j]==p[1-rev] && (j==sj || s[j-1]!=p[1-rev])){
                            string t=s.substr(0,j)+s.substr(j+1);
                            helper(t, i, j, rev);
                        }
                    }
                    return ;
                }
            }
            string rs=s;
            reverse(rs.begin(), rs.end());
            if(p[rev]=='('){
                helper(rs, 0, 0, 1-rev);
            }else{
                res.push_back(rs);
            }
        }    
    public:
        vector<string> removeInvalidParentheses(string s) {
            res.clear();
            helper(s, 0, 0, 0);
            return res;
        }
    };

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值