题目
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。
【说明:】 输入可能包含了除 ( 和 ) 以外的字符。
示例 1:
输入: “()())()”
输出: ["()()()", “(())()”]
示例 2:
输入: “(a)())()”
输出: ["(a)()()", “(a())()”]
示例 3:
输入: “)(”
输出: [""]
思路
首先正向(从左向右)检查,当’)‘的个数和大于’(‘的个数和时,说明当前一定要删除一个’)’,从第一个’)‘开始尝试删除,为了避免重复任意相邻的’)‘只需要删除其中一个。
当正向检查完毕开始反向(从右向左)检查,与正向相反,当’(‘的个数和大于’)‘的个数和时开始尝试删除’(’。
经历过正向删除和反向删除后(即findc == ‘(’)时方将此时的string串加入结果的vector中。
代码
class Solution {
private:
vector<string> result;
public:
void DFS(string s, char findc, int last) {
int count = 0, i = 0, n = s.length();
for(; i < n; i++) {
if(s[i] == '(' || s[i] == ')') {
s[i]==findc?count--:count++;
}
if(count >= 0) {
continue;
}
for(int j = last; j <= i; j++){
// 避免重复
if(s[j] == findc && (j == last || s[j] != s[j-1])) {
DFS(s.substr(0,j)+s.substr(j+1), findc, j);
}
}
return;
}
reverse(s.begin(), s.end());
if (findc == ')') {
return DFS(s, '(', 0);
}
result.push_back(s);
}
vector<string> removeInvalidParentheses(string s) {
DFS(s, ')', 0);
if(result.size() == 0) {
result.push_back("");
}
return result;
}
};
输出