题目:
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())()"] ")(" -> [""]思路1: BFS+剪枝:
public class Solution {
//BFS
public List<String> removeInvalidParentheses(String s) {
List<String> res = new ArrayList<String>();
Queue<String> q = new LinkedList<>();
Set<String> visited = new HashSet<>();
q.add(s);
boolean found = false;
while(!q.isEmpty()){
//just check same level strings
int size = q.size();
for(int k=0; k<size; k++){
String str = q.poll();
if(isValid(str)){
res.add(str);
// if(!res.contains(str)) res.add(str);
found=true;
}
//if found valid Parentheses in str level, all string in str-1 level should not be valid.
if(found) continue;
for(int i=0; i<str.length(); i++){
char c = str.charAt(i);
if(c=='('||c==')') {
String temp = str.substring(0,i)+str.substring(i+1);
//Pruning
if(!visited.contains(temp)){
q.add(temp);
visited.add(temp);
}
}
}
}
if(found) break;
}
return res;
}
//check valid Parentheses without using stack.
public boolean isValid(String s){
int count = 0;
for(int i=0; i<s.length();i++){
char c = s.charAt(i);
if(c=='(') count++;
else if(c==')'){
count--;
if(count<0) return false;
}
}
return count==0?true:false;
}
}