# LeetCode – Generate Parentheses (Java)

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

```"((()))", "(()())", "(())()", "()(())", "()()()"
```

Java Solution 1 - DFS

This solution is simple and clear. In the dfs() method, left stands for the remaining number of (, right stands for the remaining number of ).

```public List<String> generateParenthesis(int n) { ArrayList<String> result = new ArrayList<String>(); dfs(result, "", n, n); return result; } /* left and right represents the remaining number of ( and ) that need to be added. When left > right, there are more ")" placed than "(". Such cases are wrong and the method stops. */ public void dfs(ArrayList<String> result, String s, int left, int right){ if(left > right) return;   if(left==0&&right==0){ result.add(s); return; }   if(left>0){ dfs(result, s+"(", left-1, right); }   if(right>0){ dfs(result, s+")", left, right-1); } }```

Java Solution 2

This solution looks more complicated. ,You can use n=2 to walk though the code.

```public List<String> generateParenthesis(int n) { ArrayList<String> result = new ArrayList<String>(); ArrayList<Integer> diff = new ArrayList<Integer>();   result.add(""); diff.add(0);   for (int i = 0; i < 2 * n; i++) { ArrayList<String> temp1 = new ArrayList<String>(); ArrayList<Integer> temp2 = new ArrayList<Integer>();   for (int j = 0; j < result.size(); j++) { String s = result.get(j); int k = diff.get(j);   if (i < 2 * n - 1) { temp1.add(s + "("); temp2.add(k + 1); }   if (k > 0 && i < 2 * n - 1 || k == 1 && i == 2 * n - 1) { temp1.add(s + ")"); temp2.add(k - 1); } }   result = new ArrayList<String>(temp1); diff = new ArrayList<Integer>(temp2); }   return result; }```
Category >> Algorithms
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
```<pre><code>
String foo = "bar";
</code></pre>
```
• Cherry Zhao

Great analysis. If you want to see another insightful discussion with code, check https://goo.gl/ALZBh0.

• guest

Your solution doesnt work….it fails for n=4 for this case “(())(())”

• guest

Whats the time complexity of solution 1 ?

• Mando

Want to share my very simple recursive solution on C#:

“class Parenthesis”
“{”
” private List result = new List();””

” public List Generate(int n)”
” {”
” if (n <= 0)"
" throw new ArgumentException();"

” Generate(n, 0, 0, “”);”
” return this.result;”
” }”

” private void Generate(int n, int opened, int closed, string print)”
” {”
” if (opened < n)"
" Generate(n, opened + 1, closed, print + "(");"

” if (closed < opened)"
" Generate(n, opened, closed + 1, print + ")");"

” if (opened == closed && opened == n)”
” }”
“}”

• ygw

X(n+1) = { ()[X(n)] } X(n+1) = X(n) + 2

X(n) = 2n – 1

• Frank

Another approach I came up with that does not require to keep track of the opening or closing tags is as follows. It does generate the same solution multiple times however.

public static Set generateParentheses(int n, boolean print)
{
Set solutions = new HashSet();

//Case n=0 generates the empty set.
if(n > 0)
{
//Case n=1, which adds the first solution.

}

for(int i=2; i<=n; i++)
{
Set newSolutions = new HashSet();

//Loop through the combinations obtained in the previous step
for(String previousSolution : solutions)
{