package com.interview.algorithms.general;
import java.util.ArrayList;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-10-26
* Time: 下午6:26
*/
public class C1_69_NParentheses {
public static List<String> find(int n){
List<String> sol = new ArrayList<String>();
find(sol, n, n, new char[2 * n], 0);
return sol;
}
private static void find(List<String> sol, int left, int right, char[] cur, int count){
if(left < 0 || right < left) return;
if(left == 0 && right == 0) sol.add(String.copyValueOf(cur));
else {
if(left > 0){
cur[count] = '(';
find(sol, left - 1, right, cur, count + 1);
}
if(right > left){
cur[count] = ')';
find(sol, left, right - 1, cur, count + 1);
}
}
}
/*
Below is an alternative implementation
*/
public void print(int N) {
for(String s : this.generate("(", 1, 0, N))
System.out.println(s);
}
private List<String> generate(String prefix, int left, int right, int N) {
List<String> result = new ArrayList<String>();
if(left == N) {
String combination = new String(prefix);
while(right < N) {
combination += ")";
right ++;
}
result.add(combination);
} else {
if(right < N && right < left)
result.addAll(generate(prefix + ")", left, right + 1, N));
result.addAll(generate(prefix + "(", left + 1, right, N));
}
return result;
}
}