Java实现 LeetCode 301 删除无效的括号

301. 删除无效的括号

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

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

示例 1:

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

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

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

class Solution {
    public List<String> removeInvalidParentheses(String s) {
        int left = 0, right = 0;
        char[] cs = s.toCharArray();
        for(char c : cs) {
            if(c == '(') {
                left++;
            }else if(c == ')') {
                if(left == 0) right++;
                else left--;
            }
        }
        List<String> res = new ArrayList<>();
        backtrace(cs, 0, new StringBuilder(s.length()-left-right), res, 0, 0, left, right);
        return res;
    }
    
    private void backtrace(char[] cs, int cur, StringBuilder sb, List<String> res, 
                           int left, int right, int remL, int remR) {
        if(cur == cs.length) {
            if(remL == 0 && remR == 0) res.add(sb.toString());
            return;
        }
        if(right > left) return;
        final int len = sb.length();
        if(cs[cur] == '(') {
            // use 
            sb.append('(');
            backtrace(cs, cur+1, sb, res, left+1, right, remL, remR);
            sb.setLength(len);
            if(remL > 0) { // not use
                while(cur < cs.length && cs[cur] == '(') { // find next
                    cur++;
                    remL--;
                }
                if(remL >= 0) backtrace(cs, cur, sb, res, left, right, remL, remR);
            }
        }else if(cs[cur] == ')') {
            // use
            sb.append(')');
            backtrace(cs, cur+1, sb, res, left, right+1, remL, remR);
            sb.setLength(len);
            if(remR > 0) { // not use
                while(cur < cs.length && cs[cur] == ')') { // find next
                    cur++;
                    remR--;
                }
                if(remR >= 0) backtrace(cs, cur, sb, res, left, right, remL, remR);
            }
        }else {
            sb.append(cs[cur]);
            backtrace(cs, cur+1, sb, res, left, right, remL, remR);
            sb.setLength(len);
        }
    }
}
  • 20
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值