LeetCode 301. Remove Invalid Parentheses

原题链接在这里:https://leetcode.com/problems/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())()"]
")(" -> [""]

题解:

题目要求减少最小个数的非法括号,要求最小,就想到BFS.

Queue 里加入 原来的string s, 循环中从queue中poll出来一个string. 每次减掉一个括号,若是合法了就加到res中,同时停止继续enqueue, 只把queue中现有的一个level检查了就好。

若是没遇到合法的,就把str从头到尾减掉一个括号放回到queue中。

检查是否合法用isValid. 这种写法不需要stack, 节省了空间。

同时使用Set 来记录已经检查过的string, 检查过就不需要再次检查。

Time Complexity: exponential. 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 }

类似Minimum Remove to Make Valid Parentheses.

posted @ 2015-11-13 09:15  Dylan_Java_NYC  阅读(471)  评论(0编辑  收藏  举报