思路:
dfs+剪枝。
实现:
1 class Solution { 2 public: 3 int maxn=0;//已经找到的最大合法长度 4 void dfs(string&s,int cur,int cnt,string c,vector<string>&res,int maxp){ 5 int l=s.length(); 6 if(cur==l){ 7 if(cnt==0){ 8 res.push_back(c); 9 maxn=max(maxn,(int)c.length()); 10 } 11 return; 12 } 13 int rem=l-cur; 14 int len=c.length(); 15 if(len+rem<maxn)return; 16 if(cnt>maxp)return; 17 if(s[cur]=='('){ 18 dfs(s,cur+1,cnt+1,c+'(',res,maxp); 19 dfs(s,cur+1,cnt,c,res,maxp); 20 } 21 else if(s[cur]==')'){ 22 dfs(s,cur+1,cnt,c,res,maxp); 23 if(cnt)dfs(s,cur+1,cnt-1,c+')',res,maxp); 24 } 25 else dfs(s,cur+1,cnt,c+s[cur],res,maxp); 26 } 27 vector<string> removeInvalidParentheses(string s) { 28 int l=s.length(); 29 int left=0,right=0; 30 for(int i=0;i<l;i++){ 31 if(s[i]=='(')left++; 32 else if(s[i]==')')right++; 33 } 34 int maxp=min(left,right); 35 vector<string>res; 36 dfs(s,0,0,"",res,maxp); 37 unordered_set<string>st; 38 for(auto it:res){ 39 if(int(it.length())==maxn)st.insert(it); 40 } 41 return vector<string>(st.begin(),st.end()); 42 43 } 44 };