LeetCode Remove Invalid Parentheses

原題連接在這裏: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 }
相關文章
相關標籤/搜索