原题链接在这里: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 }