301. Remove Invalid Parentheses


July-10-2019

其实是个DFS的题,每个括号都可以选择去掉,或者不去掉来形成最后的结果。
比较难想到的一个地方是删和不删的标准。
首先遍历记录下需要删除的左括号和右括号的数量 -- 最终解这2个都要是0。
DFS的时候,还要计算没闭合的括号的数量,因为只算上面的话,比如()())(),多一个右,最终结果可以是()())(,错误地去掉了1个右。
然后做就行了

class Solution {
    public List<String> removeInvalidParentheses(String s) {
        Set<String> res = new HashSet<>();
        int lCount = 0;
        int rCount = 0;
        for (char c : s.toCharArray()) {
            if (c == '(') {
                lCount ++;
            } else if (c == ')') {
                if (lCount > 0) {
                    lCount --;
                } else {
                    rCount ++;
                } 
            }
        }
        
        dfs(s, res, new StringBuilder(), lCount, rCount, 0, 0);
        
        return new ArrayList<>(res);
    }
    
    public void dfs(String s, Set<String> res, StringBuilder sb, int l, int r, int pos, int openCount) {
        if (pos == s.length() && l == 0 && r == 0 && openCount == 0) {
            res.add(sb.toString());
        } else if (pos >= s.length() || l < 0 || r < 0 || openCount < 0 || l > s.length() - pos) {
            return ;
        } else {
            char tempChar = s.charAt(pos);
            int len = sb.length();
            if (tempChar == '(') {
                dfs(s, res, sb, l - 1, r, pos + 1, openCount);
                dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount + 1);
            } else if (tempChar == ')') {
                dfs(s, res, sb, l, r - 1, pos + 1, openCount);
                dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount - 1);
            } else {
                dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount);
            }
            sb.setLength(len);
        }
    }
}
posted @ 2019-07-11 13:38  哇呀呀..生气啦~  阅读(199)  评论(0编辑  收藏  举报