
class Solution {
public:
int len=0;
int max_score=0;
unordered_set<string> hash;
int n=0;
vector<string> removeInvalidParentheses(string s) {
int l=0, r=0;// l代表需要删除的左括号数量,r代表需要删除的右括号数量
n = s.size();
int right=0,left=0;// 为了剪枝,合理的字符串中最多出现多少个左括号
for(char c:s){
if(c=='('){
l++;
left++;
}else if(c==')'){
if(l!=0) l--;
else r++;
right++;
}
}
len = n - l - r;// 删除掉不合法的括号后,最后字符串的长度
max_score = min(left,right);
dfs(s,"",0,0,l,r);
return {hash.begin(),hash.end()};
}
void dfs(string s, string res, int score, int index, int l, int r){
if(res.size()==len&&score==0){
hash.insert(res);
return;
}
if(index==n) return;
if(score<0||score>max_score) return; //剪枝一
if(l<0||r<0) return; //剪枝二
char c = s[index];
if(c=='('){
dfs(s, res+c, score+1, index+1, l, r);
dfs(s, res, score, index+1, l-1, r);
}else if(c==')'){
dfs(s, res+c, score-1, index+1, l, r);
dfs(s, res, score, index+1, l, r-1);
}else{
dfs(s, res+c, score, index+1, l, r);
}
}
};