step3.检验删除后的括号串是否合法。
使用left计数器判断即可。
注意:下一层搜索的第一个参数
str1.subString(beg,end); //拷贝
str2.subStr(beg,len); //拷贝class Solution {
    private List<String> validStrList;
    public List<String> removeInvalidParentheses(String s) {
        // 得到不合法左括号数和右括号数
        int lCnt = 0;
        int rCnt = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) == '(') {
                lCnt++;
            } else if (s.charAt(i) == ')') {
                if (lCnt > 0) {
                    lCnt--;
                } else {
                    rCnt++;
                }
            }
        }
        validStrList = new ArrayList<>();
        dfs(s, 0, lCnt, rCnt);
        return validStrList;
    }
    private void dfs(String s, int pos, int lCnt, int rCnt) {
        if (lCnt == 0 && rCnt == 0) {
            if (validStr(s)) {
                validStrList.add(s);
            }
            return;
        }
        for (int i = pos; i < s.length(); ++i) {
            if (i != pos && s.charAt(i) == s.charAt(i - 1)) {
                continue;
            }
            if (lCnt > 0 && s.charAt(i) == '(') {//
                dfs(s.substring(0, i) + s.substring(i + 1), i, lCnt - 1, rCnt);//
            }
            if (rCnt > 0 && s.charAt(i) == ')') {//
                dfs(s.substring(0, i) + s.substring(i + 1), i, lCnt, rCnt - 1);//
            }
        }
    }
    private boolean validStr(String s) {
        int left = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) == '(') {
                left++;
            } else if (s.charAt(i) == ')') {
                if (left <= 0) {
                    return false;
                }
                left--;
            }
        }
        return left == 0;
    }
}原文:https://www.cnblogs.com/coding-gaga/p/12239828.html