題目:
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