301. Remove Invalid Parentheses


題目:

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())()"]
")(" -> [""]

鏈接: http://leetcode.com/problems/remove-invalid-parentheses/

題解:

給定String,去除invalid括號,輸出所有結果集。一開始想的是DFS + Backtracking,沒有堅持下去。后來在Discuss里發現了jeantimex大神的BFS方法非常好,於是搬過來借鑒。方法是我們每次去掉一個"("或者")",然后把新的string加入到Queue里,繼續進行計算。要注意的是需要設置一個boolean foundResult,假如在這一層找到結果的話,我們就不再繼續進行下面的for循環了。這里應該還可以繼續剪枝一下,比如記錄當前這個結果的長度len,當queue里剩下的string長度比這個len小的話,我們不進行驗證isValid這一步。

Time Complexity - O(n * 2n), Space Complexity - O(2n)

public class Solution {
    public List<String> removeInvalidParentheses(String s) {
        List<String> res = new ArrayList<>();
        if(s == null) {
            return res;
        }
        Queue<String> queue = new LinkedList<>();
        Set<String> visited = new HashSet<>();
        queue.offer(s);
        boolean foundResult = false;
        
        while(!queue.isEmpty()) {
            s = queue.poll();
            if(isValid(s)) {
                res.add(s);
                foundResult = true;
            }
            if(foundResult) {
                continue;
            }
            for(int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if(c == '(' || c == ')') {
                    String t = s.substring(0, i) + s.substring(i + 1);
                    if(!visited.contains(t)) {
                        queue.offer(t);
                        visited.add(t);
                    }
                }
            }
        }
        
        return res;
    }
    
    private boolean isValid(String s) {
        int leftCount = 0;
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '(') {
                leftCount++;
            } else if (c == ')') {
                leftCount--;
            }
            if(leftCount < 0) {
                return false;
            }
        }
        
        return leftCount == 0;
    }
}

 

Reference:

https://leetcode.com/discuss/67842/share-my-java-bfs-solution

https://leetcode.com/discuss/67853/my-c-dfs-solution-16ms

https://leetcode.com/discuss/67919/java-optimized-dfs-solution-3-ms

https://leetcode.com/discuss/67861/short-python-bfs

https://leetcode.com/discuss/72208/easiest-9ms-java-solution

https://leetcode.com/discuss/67861/short-python-bfs

https://leetcode.com/discuss/72208/easiest-9ms-java-solution

https://leetcode.com/discuss/67908/java-bfs-solution-16ms-avoid-generating-duplicate-strings

https://leetcode.com/discuss/67821/and-bfs-java-solutions-add-more-optimized-fast-dfs-solution

https://leetcode.com/discuss/68038/clean-java-solution-bfs-optimization-40ms

https://leetcode.com/discuss/68010/fast-optimized-dfs-java-solution

 


免責聲明!

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



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