LeetCode Q 301 - 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 )
.
Example 1:Input: "()())()" ; Output: ["()()()", "(())()"]
Example 2:Input: "(a)())()" ; Output: ["(a)()()", "(a())()"]
Example 3:Input: ")(" ; Output: [""]
Solution : DFS
- pre-process the String
s
, determine how many(
s and)
s we need to delete. - To avoid duplicates, use a set to store the result.
- Backtrack finding the answer.
- corner cases:
if (rmL < 0 || rmR < 0 || open < 0)
indicates an invalid string, we should return; - our goal(i.e. when to break the backtrack):
if (pos == s.length())
we should also stop the backtrack, and checkif (rmL == 0 && rmR == 0 && open == 0)
, then update the result set;- else just ruturn;
- explore
- if current char is ‘(‘ or ‘)’ we can either choose to use it or not.
- if current char is a letter we update current string.
- corner cases:
Code:
Set<String> res; // avoid duplicates
public List<String> removeInvalidParentheses(String s) {
res = new HashSet<>();
int rmL = 0, rmR = 0;
for (char ch: s.toCharArray()) {
if (ch == '(') {
rmL++;
} else if (ch == ')') {
if (rmL != 0) rmL--;
else rmR++;
}
}
dfs(s, 0, "", rmL, rmR, open);
return new ArrayList(res);
}
private void dfs(String s, int pos, String curr, int rmL, int rmR, int open) {
if (rmL < 0 || rmR < 0 || open < 0) return;
if (pos == s.length()) {
if (rmL == 0 && rmR == 0 && open == 0) res.add(curr);
return;
}
char ch = s.charAt(pos);
if (ch == '(') {
dfs(s, pos + 1, curr + ch, rmL, rmR, open + 1); // use '('
dfs(s, pos + 1, curr, rmL - 1, rmR, open); // not use '('
} else if (ch == ')') {
dfs(s, pos + 1, curr + ch, rmL, rmR, open - 1); // use ')'
dfs(s, pos + 1, curr, rmL, rmR - 1, open); // not use ')'
} else {
dfs(s, pos + 1, curr + ch, rmL, rmR, open);
}
return;
}