###### tags: `LeetCode` `Recursion` `Hard`
# LeetCode #301 [Remove Invalid Parentheses](https://leetcode.com/problems/remove-invalid-parentheses/)
### (Hard)
給你一個由若干括號和字母組成的字符串 s ,刪除最小數量的無效括號,使得輸入的字符串有效。
返回所有可能的結果。答案可以按 任意順序 返回。
---
首先要計算出多餘的左括號與右括號, 多餘的右括號發生在右括號數量大於左括號時, 而多餘的左括號數量則是最後結算時多於右括號的數量。
得知多餘的左右括號數量後, 即可得到需要消除多少個括號才能達成有效字串, 此時的暴力法就是使用DFS不斷消除括號直到消除數量等於多餘括號, 此時檢查剩下的字串是否為有效字串, 若是則將該字串加入答案數組中。
這個方法雖然正確但或許不是最好的, 因為是窮舉所有組合再去篩選是否為有效字串, 不確定是否有方法能夠消除正確的多餘括號(不需要額外判斷為合法字串的方法)。
---
```
class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
int left=0, right=0;
vector<string> ans;
for(auto c:s){
if(c=='(')left++;
else if(c==')'){
if(left)left--;
else if(!left)right++;
}
}
dfs(s, 0, left+right, ans);
return ans;
}
void dfs(string& s, int pos, int count, vector<string>& ans){
if(isvalid(s)&&count==0){
ans.push_back(s);
return;
}
for(int i=pos;i<s.length();i++){
if(i!=pos&&s[i]==s[i-1])continue;
if(s[i]=='('||s[i]==')'){
if(count>0){
string curr=s;
curr.erase(i,1);
dfs(curr, i, count-1, ans);
}
}
}
}
bool isvalid(string s){
int n=0;
for(auto c:s){
if(c=='(')n++;
else if(c==')')n--;
if(n<0)return false;
}
return n==0;
}
};
```