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())()"]
")(" -> [""]
Credits:
Special thanks to @hpplayer for adding this problem and creating all test cases.
思路:就是一个bfs,把每一层的可能性画出来,然后如果在这一层发现了valid string,那么就只搜索这一层就够了。不用往下enqueue了。HashSet是为了去重;
错误点:找到了,就别再继续走下一层了,if(found) continue;别忘记写了。
isvalid函数,用count来++左括号,--右括号,这个思路,学习了,需要掌握。
class Solution {
public List<String> removeInvalidParentheses(String s) {
List<String> list = new ArrayList<>();
Queue<String> queue = new LinkedList<>();
queue.offer(s);
boolean find = false;
HashSet<String> visited = new HashSet<>();
while(!queue.isEmpty()) {
int size = queue.size();
for(int k = 0; k < size; k++) {
String node = queue.poll();
if(isvalid(node)) {
list.add(node);
find = true;
}
if(find) continue;
for(int i = 0; i < node.length(); i++) {
if(node.charAt(i) == '(' || node.charAt(i) == ')') {
String substr = node.substring(0, i) + node.substring(i + 1);
if(!visited.contains(substr)) {
visited.add(substr);
queue.offer(substr);
}
}
}
}
}
return list;
}
private boolean isvalid(String str) {
int count = 0;
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == '(') {
count++;
} else if(str.charAt(i) == ')') {
count--;
if(count < 0) {
return false;
}
}
}
return count == 0;
}
}