Skip to content

301 Remove Invalid Parentheses

Problem

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 ).

Examples:

"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]

Solutions

BFS

class Solution {
    public List<String> removeInvalidParentheses(String s) {
        List<String> res = new LinkedList<String>();    
        HashSet<String> visited = new HashSet<String>();
        Queue<String> q = new LinkedList<String>();
        q.add(s);
        Queue<Integer> levels = new LinkedList<Integer>();
        visited.add(s);
        levels.add(0);
        int found = -1;
        while (!q.isEmpty()) {
            String cand = q.poll();
            int level = levels.poll();
            if (found != -1 && level > found) {
                break;
            }
            if (isValid(cand)) {
                found = level;
                res.add(cand);
                continue;
            }
            for (int i = 0; i < cand.length(); i ++) {
                String newcand = cand.substring(0, i) + cand.substring(i + 1);
                if (!visited.contains(newcand)) {
                    q.add(newcand);
                    visited.add(newcand);
                    levels.add(level + 1);
                }
            }

        }
        return res;
    }
    private boolean isValid(String s) {
        int count = 0;
        for (int i = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (c == '(') {
                count ++;
            }
            else if (c == ')'){
                if (count <= 0) {
                    return false;
                }
                count --;
            }
        }
        return count == 0;
    }
}

DFS

public class Solution {
    ArrayList<String> res = new ArrayList<String>();
    int max = 0; 
    public List<String> removeInvalidParentheses(String s) {
        if(s == null) {
            return res;
        }
        dfs(s, "", 0);
        if(res.size() == 0) {
            res.add("");
        }
        return res;
    }
    public void dfs(String s, String cand, int left) {
        if(s.length() == 0){
            if(left == 0 && cand.length() != 0) {
                if (cand.length() > max) {
                    max = cand.length();
                    res.clear();
                }
                if(cand.length() == max && !res.contains(cand)) {
                    res.add(cand);
                }
            }
            return;
        }

        if (s.charAt(0) == '(') {
            dfs(s.substring(1), cand + "(", left + 1);
            dfs(s.substring(1), cand, left);
        }
        else if (s.charAt(0) == ')') {
            if (left > 0) {
                dfs(s.substring(1), cand + ")", left - 1);
            }
            dfs(s.substring(1), cand, left);
        }else{
            dfs(s.substring(1), cand + s.charAt(0), left);
        }
    }
}