刷
July-10-2019
其实是个DFS的题,每个括号都可以选择去掉,或者不去掉来形成最后的结果。
比较难想到的一个地方是删和不删的标准。
首先遍历记录下需要删除的左括号和右括号的数量 -- 最终解这2个都要是0。
DFS的时候,还要计算没闭合的括号的数量,因为只算上面的话,比如()())(),多一个右,最终结果可以是()())(,错误地去掉了1个右。
然后做就行了
class Solution {
public List removeInvalidParentheses(String s) {
Set res = new HashSet<>();
int lCount = 0;
int rCount = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
lCount ++;
} else if (c == ')') {
if (lCount > 0) {
lCount --;
} else {
rCount ++;
}
}
}
dfs(s, res, new StringBuilder(), lCount, rCount, 0, 0);
return new ArrayList<>(res);
}
public void dfs(String s, Set res, StringBuilder sb, int l, int r, int pos, int openCount) {
if (pos == s.length() && l == 0 && r == 0 && openCount == 0) {
res.add(sb.toString());
} else if (pos >= s.length() || l < 0 || r < 0 || openCount < 0 || l > s.length() - pos) {
return ;
} else {
char tempChar = s.charAt(pos);
int len = sb.length();
if (tempChar == '(') {
dfs(s, res, sb, l - 1, r, pos + 1, openCount);
dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount + 1);
} else if (tempChar == ')') {
dfs(s, res, sb, l, r - 1, pos + 1, openCount);
dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount - 1);
} else {
dfs(s, res, sb.append(tempChar), l, r, pos + 1, openCount);
}
sb.setLength(len);
}
}
}