题目:
https://leetcode.com/problems/remove-invalid-parentheses/
思路:
广度优先遍历。在返回最终结果res前,注意去重!
class Solution
{
public:
//参数kuohao代表此次递归里cur中左括号数量减去右括号数量的值,可见kuohao是非负整数
void removeInvalidParentheses_core(string &s,int begin,int kuohao,string &cur,vector<string> &res)
{
//s[begin]肯定是待处理的'('或')'
if(begin==s.size())//递归截止条件
{
if(kuohao!=0)
return;
if(res.empty() || res[0].size()==cur.size())
res.push_back(cur);
if(!res.empty() && res[0].size()<cur.size())
{
res.clear();
res.push_back(cur);
}
return;
}
//要这个s[begin]
if(begin>s.size())
return;
if(s[begin]=='(' && (s.size()-begin-1>=1+kuohao))
{
int yaru=1,tmp_kuohao=kuohao;
cur.push_back(s[begin]);
int i=begin+1;
++tmp_kuohao;
while(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
else if(s[begin]==')' && kuohao>0)
{
int yaru=1,tmp_kuohao=kuohao;
cur.push_back(s[begin]);
int i=begin+1;
--tmp_kuohao;
while(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
//不要这个s[begin]
int i=begin;
i++;
int yaru=0;
while(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
vector<string> removeInvalidParentheses(string s)
{
if(s.empty())
{
return vector<string>(1,"");
}
if(s.size()==1)
{
if(s[0]=='('||s[0]==')')
s.pop_back();
return vector<string>(1,s);
}
int i=0;//s[i]是第一个'('
while(i<s.size() && s[i]!='(')
{
++i;
}
string cur;//cur是s[0:i-1]中去掉')'的字符串
for(int j=0;j<i;++j)
{
if(s[j]!=')')
cur.push_back(s[j]);
}
if(i==s.size())//s没有字符'('
{
return vector<string>(1,cur);
}
vector<string> res;
removeInvalidParentheses_core(s,i,0,cur,res);
sort(res.begin(),res.end());
res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
};