def generate_parenthesis(n):
result=[]
def backtrack(s,open,close):
if len(s)==2*n: result.append(s); return
if open<n: backtrack(s+'(',open+1,close)
if close<open: backtrack(s+')',open,close+1)
backtrack('',0,0)
return result
public List<String> generateParenthesis(int n){
List<String> res=new ArrayList<>();
backtrack(res,"",0,0,n);
return res;
}
void backtrack(List<String> res,String s,int open,int close,int n){
if(s.length()==2*n){res.add(s);return;}
if(open<n) backtrack(res,s+"(",open+1,close,n);
if(close<open) backtrack(res,s+")",open,close+1,n);
}
Python nested function captures result. Java passes it as parameter.
def generate_parenthesis(n):
result=[]
def backtrack(s,open,close):
if len(s)==2*n: result.append(s); return
if open<n: backtrack(s+'(',open+1,close)
if close<open: backtrack(s+')',open,close+1)
backtrack('',0,0)
return result
public List<String> generateParenthesis(int n){
List<String> res=new ArrayList<>();
backtrack(res,"",0,0,n);
return res;
}
void backtrack(List<String> res,String s,int open,int close,int n){
if(s.length()==2*n){res.add(s);return;}
if(open<n) backtrack(res,s+"(",open+1,close,n);
if(close<open) backtrack(res,s+")",open,close+1,n);
}
1. Track open and close counts 2. Add ( if open<n 3. Add ) if close<open