class Solution {
public List<String> removeInvalidParentheses(String s) {
int leftRemove = 0, rightRemove = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
leftRemove++;
} else if (c == ')') {
if (leftRemove > 0) {
leftRemove--;
} else {
rightRemove++;
}
}
}
Set<String> res = new HashSet<>();
dfs(s, leftRemove, rightRemove, 0, 0, "", res);
return new ArrayList<>(res);
}
private void dfs(String s, int leftRemove, int rightRemove, int pair, int pos, String path, Set<String> res) {
if (leftRemove < 0 || rightRemove < 0 || pair < 0) {
return;
} else if (pos == s.length()) {
if (pair == 0 && leftRemove == 0 && rightRemove == 0) {
res.add(path);
}
return;
}
if (s.charAt(pos) == '(') {
dfs(s, leftRemove, rightRemove, pair + 1, pos + 1, path + "(", res);
dfs(s, leftRemove - 1, rightRemove, pair, pos + 1, path, res);
} else if (s.charAt(pos) == ')') {
dfs(s, leftRemove, rightRemove, pair - 1, pos + 1, path + ")", res);
dfs(s, leftRemove, rightRemove - 1, pair, pos + 1, path, res);
} else {
dfs(s, leftRemove, rightRemove, pair, pos + 1, path + s.charAt(pos), res);
}
}
}