301. Remove Invalid Parentheses

1、題目ui

  一、審題 spa

  

  二、分析code

    給出一個包含 '('、')' 的字符串,去除最少的字符,使得左右括號能正確閉合。求出全部的正確閉合的字符串。blog

 

2、解答ci

  一、思路leetcode

    https://leetcode.com/problems/remove-invalid-parentheses/discuss/75027/Easy-Short-Concise-and-Fast-Java-DFS-3-ms-solutionrem

    ①、從左向右掃描,判斷是否有多餘的 ')',若在 i 位置時有 ')' 多餘,則從頭開始掃描,如有 ')' 出現,且其前面一個字符不是 ')' 則吧這個字符去除。字符串

    ②、經過步驟 ① 能夠去除多餘的 ')'。get

    ②、 將字符串翻轉,判斷 是否有多餘的 '(';string

public List<String> removeInvalidParentheses(String s) {
        List<String> ans = new ArrayList<String>();
        remove(s, ans, 0, 0, new char[]{'(', ')'});
        return ans;
    }

    //     last_i 以前的都已匹配; last_j: 從 last_j 開始去除一個多餘的 ")"
    private void remove(String s, List<String> ans, int last_i, int last_j, char[] par) {
        
        // i < s.length();
        for (int stack = 0, i = last_i; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(ch == par[0]) 
                stack++;
            else if(ch == par[1]) 
                stack--;
            if(stack >= 0)
                continue;
            // stack < 0
            for (int j = last_j; j <= i; ++j) //step1: 判斷 ")" 是否匹配。
                if(s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1])) // 不是連續的 "))" 的狀況
                    remove(s.substring(0, j) + s.substring(j + 1), ans, i, j, par);
            return;
        }
        
        // 從上一個 for 中跳出來了,不容易啊!從左向右是知足匹配的。
        String reversed = new StringBuilder(s).reverse().toString();
        if(par[0] == '(') //step2: 在判斷 "(" 是否匹配。
            remove(reversed, ans, 0, 0, new char[]{')', '('});
        else
            ans.add(reversed);
    }
相關文章
相關標籤/搜索