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: [""]
题解:
使用dfs查找,先遍历字符串找出最少需要删除的左括号和右括号个数,然后dfs删除。
class Solution {
public:
bool isValid(string s) {
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(') {
cnt++;
}
else if (s[i] == ')') {
cnt--;
if (cnt < 0) {
return false;
}
}
}
return cnt == 0;
}
void dfs(int k, string &s, unordered_set<string> &res, string tmp, int left, int right, int n) {
if (k == n) {
if (left == 0 && right == 0 && isValid(tmp) == true) {
res.insert(tmp);
}
}
else {
if (s[k] == '(') {
if (left > 0) {
dfs(k + 1, s, res, tmp, left - 1, right, n);
}
}
else if (s[k] == ')') {
if (right > 0) {
dfs(k + 1, s, res, tmp, left, right - 1, n);
}
}
dfs(k + 1, s, res, tmp + s[k], left, right, n);
}
}
vector<string> removeInvalidParentheses(string s) {
int n = s.length();
if (n == 0) {
return {""};
}
int left = 0, right = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(') {
left++;
}
if (s[i] == ')') {
if (left > 0) {
left--;
}
else {
right++;
}
}
}
unordered_set<string> res;
dfs(0, s, res, "", left, right, n);
return vector<string>(res.begin(), res.end());
}
};