Leetcode每日两题数据结构和算法分析程序员

Leetcode 301. Remove Invalid Par

2018-03-06  本文已影响11人  ShutLove

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.
Note: The input string may contain letters other than the parentheses ( and ).

题意:去掉最少的括号,使得表达式的括号匹配,返回所有符合条件的结果。

思路:

    public List<String> removeInvalidParentheses(String s) {
        int rmL = 0, rmR = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                rmL++;
            } else if (s.charAt(i) == ')') {
                if (rmL != 0) {
                    rmL--;
                } else {
                    rmR++;
                }
            }
        }
        Set<String> res = new HashSet<>();
        dfs(s, 0, res, new StringBuilder(), rmL, rmR, 0);
        return new ArrayList<String>(res);
    }

    public void dfs(String s, int i, Set<String> res, StringBuilder sb, int rmL, int rmR, int open) {
        if (rmL < 0 || rmR < 0 || open < 0) {
            return;
        }
        if (i == s.length() && rmL == 0 && rmR == 0 && open == 0) {
            res.add(sb.toString());
            return;
        }
//        System.out.println("before:" + sb.toString());

        char c = s.charAt(i);
        int len = sb.length();

        if (c == '(') {
            //先not use再use,不能颠倒顺序,否则先append的结果会带到下面导致open计数会不准
            dfs(s, i + 1, res, sb, rmL - 1, rmR, open);         // not use (
            dfs(s, i + 1, res, sb.append(c), rmL, rmR, open + 1);       // use (
        } else if (c == ')') {
            dfs(s, i + 1, res, sb, rmL, rmR - 1, open);             // not use  )
            dfs(s, i + 1, res, sb.append(c), rmL, rmR, open - 1);       // use )

        } else {
            dfs(s, i + 1, res, sb.append(c), rmL, rmR, open);
        }

//        System.out.println("after:" + sb.toString());
        sb.setLength(len);
//        System.out.println("set:" + sb.toString());
    }
上一篇 下一篇

猜你喜欢

热点阅读