classSolution{public:vector<string>removeInvalidParentheses(strings){vector<string>ans;constauto[l,r]=getLeftAndRightCounts(s);dfs(s,0,l,r,ans);returnans;}private:// Very simliar to 921. Minimum Add to Make Parentheses Valid// Returns how many '(' and ')' need to be deletedpair<int,int>getLeftAndRightCounts(conststring&s){intl=0;intr=0;for(constcharc:s)if(c=='(')++l;elseif(c==')'){if(l==0)++r;else--l;}return{l,r};}voiddfs(conststring&s,intstart,intl,intr,vector<string>&ans){if(l==0&&r==0&&isValid(s)){ans.push_back(s);return;}for(inti=start;i<s.length();++i){if(i>start&&s[i]==s[i-1])continue;if(l>0&&s[i]=='(')// Delete s[i]dfs(s.substr(0,i)+s.substr(i+1),i,l-1,r,ans);if(r>0&&s[i]==')')// Delete s[i]dfs(s.substr(0,i)+s.substr(i+1),i,l,r-1,ans);}}boolisValid(conststring&s){intcount=0;// # of '(' - # of ')'for(constcharc:s){if(c=='(')++count;elseif(c==')')--count;if(count<0)returnfalse;}returntrue;// Count == 0}};
classSolution{publicList<String>removeInvalidParentheses(Strings){List<String>ans=newArrayList<>();finalint[]counts=getLeftAndRightCounts(s);dfs(s,0,counts[0],counts[1],ans);returnans;}// Very simliar to 921. Minimum Add to Make Parentheses Valid// Returns how many '(' and ')' need to be deletedprivateint[]getLeftAndRightCounts(finalStrings){intl=0;intr=0;for(finalcharc:s.toCharArray())if(c=='(')++l;elseif(c==')'){if(l==0)++r;else--l;}returnnewint[]{l,r};}privatevoiddfs(finalStrings,intstart,intl,intr,List<String>ans){if(l==0&&r==0&&isValid(s)){ans.add(s);return;}for(inti=start;i<s.length();++i){if(i>start&&s.charAt(i)==s.charAt(i-1))continue;if(l>0&&s.charAt(i)=='(')// Delete s[i]dfs(s.substring(0,i)+s.substring(i+1),i,l-1,r,ans);elseif(r>0&&s.charAt(i)==')')// Delete s[i]dfs(s.substring(0,i)+s.substring(i+1),i,l,r-1,ans);}}privatebooleanisValid(finalStrings){intcount=0;// # of '(' - # of ')'for(finalcharc:s.toCharArray()){if(c=='(')++count;elseif(c==')')--count;if(count<0)returnfalse;}returntrue;// Count == 0}}
classSolution:defremoveInvalidParentheses(self,s:str)->List[str]:defgetLeftAndRightCounts(s:str)->tuple:l=0r=0forcins:ifc=='(':l+=1elifc==')':ifl==0:r+=1else:l-=1returnl,rdefisValid(s:str):count=0# Number of '(' - # Of ')'forcins:ifc=='(':count+=1elifc==')':count-=1ifcount<0:returnFalsereturnTrue# Count == 0ans=[]defdfs(s:str,start:int,l:int,r:int)->None:ifl==0andr==0andisValid(s):ans.append(s)returnforiinrange(start,len(s)):ifi>startands[i]==s[i-1]:continueifr>0ands[i]==')':# Delete s[i]dfs(s[:i]+s[i+1:],i,l,r-1)elifl>0ands[i]=='(':# Delete s[i]dfs(s[:i]+s[i+1:],i,l-1,r)l,r=getLeftAndRightCounts(s)dfs(s,0,l,r)returnans