解法一:recursion DFS
class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
int l=0, r=0;
for(char a:s){
if(a=='(') l++;
else if(a==')'){
if(l>0) l--;
else r++;
}
}
vector<string> res;
helper(s, 0, l, r, res);
return res;
}
void helper(string s, int pos, int l, int r, vector<string>& res){
if(l==0 && r==0) {
if(isvalid(s)) res.push_back(s);
}
else{
for(int i=pos;i<s.size();i++){
if(pos!=i && s[i]==s[i-1]) continue;
if(l>0 && s[i]=='(')
helper(s.substr(0,i)+s.substr(i+1), i, l-1, r, res);
if(r>0 && s[i]==')')
helper(s.substr(0,i)+s.substr(i+1), i, l, r-1, res);
}
}
}
bool isvalid(string& s){
int l=0;
for(char a:s){
if(a=='(') l++;
else if(a==')'){
l--;
if(l<0) return false;
}
}
return l==0;
}
};
Notes
1.删除多余的括号就行
2.在只有一种parentheses的情况,check if valid 可以用一个variable来代替stack
3.还是需要final check if valid 因为(l==r) != ()
4.if(pos!=i && s[i]==s[i-1]) continue; --> 避免重复答案
解法二:non-recursion BFS
class Solution {
public:
bool isvalid(string& s){
int l=0;
for(char c:s){
if(c=='(') l++;
else if(c==')'){
l--;
if(l<0) return false;
}
}
return l==0;
}
vector<string> removeInvalidParentheses(string s) {
vector<string> res;
queue<string> q;
set<string> visited;
bool found = false;
visited.insert(s);
q.push(s);
while(!q.empty()){
string t = q.front();
q.pop();
if(isvalid(t)){
res.push_back(t);
found = true;
}
if(found) continue;
for(int i=0;i<t.size();i++){
if(t[i]!='(' && t[i]!=')') continue;
string tt = t.substr(0,i)+t.substr(i+1);
if(!visited.count(tt)){
q.push(tt);
visited.insert(tt);
}
}
}
return vector<string>(res.begin(), res.end());
}
};
Notes
1.set<string> visited - solve the problem of memory limit exceeded