Leetcode: 301.Remove Invalid Parentheses
對一系列左右括號的非法序列,將其中最小個數的方法括號去掉,使得變成一個非法的式子。
這道題目難在找規律。要分幾種情況考慮。例如對於()())(),從開頭到s[4]位置構成的子串多了一個右括號,因此我們需要刪掉一個,而這個子串有三個右括號,但是隻會產生2個結果,也就是會有一個重複值。所以在刪除括號的時候,爲保證不會產生重複值,需要記錄一個最後刪除的位置,這樣可以使得在接下來刪除的時候只刪除這個位置之後的值。這樣我們可以使得當前這一段子串不再包含多餘的右括號了。這樣我們可以刪除了一個右括號之後合法的子串與後面還沒有檢查過的子串組成一個新的字符串重新開始檢查.直到不再含有非法的右括號。
然後左括號同理,翻轉一下就行了,複雜度O(n^2)
。
代碼
class Solution {
public:
void DFS(string s, char ch, int last)
{
for(int i = 0, cnt = 0; i < s.size(); i++)
{
if(s[i]=='('||s[i]==')') s[i]==ch?cnt++:cnt--;
if(cnt <= 0) continue;
for(int j = last; j <= i; j++)
{
if(s[j] == ch && (j ==last || s[j-1]!= ch))
DFS(s.substr(0, j)+s.substr(j+1), ch, j);
}
return;
}
reverse(s.begin(), s.end());
if(ch == ')') return DFS(s, '(', 0);
ans.push_back(s);
}
vector<string> removeInvalidParentheses(string s) {
DFS(s, ')', 0);
return ans;
}
private:
vector<string> ans;
};