Leetcode之深度優先搜索(DFS)專題-301. 刪除無效的括號(Remove Invalid Parentheses)


Leetcode之深度優先搜索(DFS)專題-301. 刪除無效的括號(Remove Invalid Parentheses)


 

刪除最小數量的無效括號,使得輸入的字符串有效,返回所有可能的結果。

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

示例 1:

輸入: "()())()"
輸出: ["()()()", "(())()"]

示例 2:

輸入: "(a)())()"
輸出: ["(a)()()", "(a())()"]

示例 3:

輸入: ")("
輸出: [""]



分析:需要以下三個步驟:
1、判斷需要刪除的括號的個數
2、刪除到錯誤個數為0
3、再次判斷序列是否合法,加入

AC代碼:
class Solution {
    public List<String> removeInvalidParentheses(String s) {
        //統計需要刪除多少個左右括號
        int l = 0, r = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') l++;
            else if (s.charAt(i) == ')') {
                if (l > 0) l--;//此時有左括號可以和右括號匹配
                else r++;//此時右括號落單
            }
        }
        List<String> res = new ArrayList<>();
        dfs(s, 0, l, r, res);
        return res;
    }

    private void dfs(String s, int start, int l, int r, List<String> res) {
        //遞歸終止條件,沒有要刪除的左括號和右括號
        //此時要判斷字符串是否合法,合法的話就加入結果中
        if (l == 0 && r == 0) {
            if (isValid(s)) res.add(s);
            return;
        }

        for (int i = start; i < s.length(); i++) {
            if (i != start && s.charAt(i) == s.charAt(i - 1)) continue;//連續多個相同的括號只刪除第一個
            if (s.charAt(i) == '(' || s.charAt(i) == ')') {
                String cur = s;
                cur = cur.substring(0,i) + cur.substring(i+1);
                if (r > 0 && s.charAt(i) == ')') dfs(cur, i, l, r - 1, res);
                else if (l > 0 && s.charAt(i) == '(') dfs(cur, i, l - 1, r, res);
            }
        }
    }

    private boolean isValid(String s) {
        int count = 0;
        char[] chars = s.toCharArray();
        for (char ch : chars) {
            if (ch == '(') count++;
            if (ch == ')') count--;
            if (count < 0) return false;
        }
        return count == 0;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM