301. 删除无效的括号(BFS)

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

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

示例 1:

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

示例 2:

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

示例 3:

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

思路: 广度优先 BFS

/*
    * 广度优先 BFS
    * */
    public List<String> removeInvalidParentheses(String s) {
        List<String> res = new ArrayList<>();

        if (s == null)
            return res;

        if (s.length() == 0) {
            res.add("");
            return res;
        }

        Queue<String> queue = new LinkedList<>();
        Set<String> set = new HashSet<>();

        queue.offer(s);
        set.add(s);

        boolean bl = false;

        while (!queue.isEmpty()) {
            String curStr = queue.poll();
            if (isTrue(curStr)) {
                res.add(curStr);
                bl = true;
            }

            if (bl)
                continue;

            for (int i = 0; i < curStr.length(); i++) {
                if (curStr.charAt(i) != '(' && curStr.charAt(i) != ')')
                    continue;

                String str1 = curStr.substring(0, i);
                String str2 = curStr.substring(i + 1);
                String str3 = str1 + str2;
                if (!set.contains(str3)) {
                    queue.offer(str3);
                    set.add(str3);
                }
            }
        }
        return res;
    }

    private boolean isTrue(String str) {
        if (str == null || str.length() == 0)
            return true;
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(')
                count++;
            if (str.charAt(i) == ')')
                count--;

            if (count < 0)
                return false;
        }
        return count == 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值