原題連接在這裏:https://leetcode.com/problems/remove-invalid-parentheses/spa
題目:code
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.blog
Note: The input string may contain letters other than the parentheses (
and )
.leetcode
Examples:rem
"()())()" -> ["()()()", "(())()"] "(a)())()" -> ["(a)()()", "(a())()"] ")(" -> [""]
題解:get
題目要求減小最小個數的非法括號,要求最小,就想到BFS.input
Queue 里加入 原來的string s, 循環中從queue中poll出來一個string. 每次減掉一個括號,如果合法了就加到res中,同時中止繼續enqueue, 只把queue中現有的一個level檢查了就好。string
如果沒遇到合法的,就把str從頭至尾減掉一個括號放回到queue中。it
檢查是否合法用isValid. 這種寫法不須要stack, 節省了空間。io
同時使用Set 來記錄已經檢查過的string, 檢查過就不須要再次檢查。
Time Complexity: O(n^2). n = s.length(). Space: O(n).
AC Java:
1 public class Solution { 2 public List<String> removeInvalidParentheses(String s) { 3 List<String> res = new ArrayList<String>(); 4 if(s == null){ 5 return res; 6 } 7 8 LinkedList<String> que = new LinkedList<String>(); 9 HashSet<String> visited = new HashSet<String>(); //存儲已經檢查過的string, 沒有必要重複檢查 10 que.add(s); 11 visited.add(s); 12 boolean found = false; //標籤,檢查是否找到了valid parentheses 13 14 while(!que.isEmpty()){ 15 String str = que.poll(); 16 if(isValid(str)){ 17 res.add(str); 18 found = true; 19 } 20 if(found){ //已經找到,就在本level中找剩下的就行了 21 continue; 22 } 23 for(int i = 0; i<str.length(); i++){ 24 if(str.charAt(i) != '(' && str.charAt(i) != ')'){ 25 continue; 26 } 27 String newStr = str.substring(0,i) + str.substring(i+1); 28 if(!visited.contains(newStr)){ 29 que.add(newStr); 30 visited.add(newStr); 31 } 32 } 33 } 34 return res; 35 } 36 37 private boolean isValid(String s){ 38 int count = 0; 39 for(int i = 0; i<s.length(); i++){ 40 if(s.charAt(i) == '('){ 41 count++; 42 } 43 if(s.charAt(i) == ')'){ 44 if(count == 0){ 45 return false; 46 }else{ 47 count--; 48 } 49 } 50 } 51 return count == 0; 52 } 53 }