LeetCode301
给你一个由若干括号和字母组成的字符串 s
,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
示例 1:
输入:s = "()())()" 输出:["(())()","()()()"]
示例 2:
输入:s = "(a)())()" 输出:["(a())()","(a)()()"]
示例 3:
输入:s = ")(" 输出:[""]
提示:
1 <= s.length <= 25
s
由小写英文字母以及括号'('
和')'
组成s
中至多含20
个括号
思路:
暴力。
先计算有多少个多出来的'('和')',然后把它们逐一去掉。放到新的string里。
放进右括号的时候要确保当前右括号要比左括号少。
代码:
class Solution {
public:
unordered_set<string> us;
vector<string> removeInvalidParentheses(string s) {
int left=0;
int right=0;
int top=-1;
for(int i=0;i<s.length();i++)
{
if(s[i]=='(')++top;
else if(s[i]==')'){
if(top==-1)right++;
else top--;
}
}
if(top!=-1)left=top+1;
string t="";
dfs(s,t,0,left,right,0,0);
vector<string> v;
for(auto i:us){
v.push_back(i);
}
return v;
}
void dfs(string& s,string& t,int i,int l,int r,int llen,int rlen)
{
if(i==s.length()){
if(l==0&&r==0)us.insert(t);
return;
}
if(s[i]=='('&&l>0)dfs(s,t,i+1,l-1,r,llen,rlen);
if(s[i]==')'&&r>0)dfs(s,t,i+1,l,r-1,llen,rlen);
t.push_back(s[i]);
if(s[i]!='('&&s[i]!=')')dfs(s,t,i+1,l,r,llen,rlen);
else if(s[i]=='(')dfs(s,t,i+1,l,r,llen+1,rlen);
else if(llen>rlen)dfs(s,t,i+1,l,r,llen,rlen+1);
t.pop_back();
}
};