Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
public class Solution {
public List<String> generateParenthesis(int n) {
ArrayList<String> list = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
Stack<Integer> validationStack = new Stack<Integer>();
stack.push("(");
validationStack.push(0);
while(stack.size() != 0)
{
String s = stack.pop();
int v = validationStack.pop();
if(s.length() == n * 2)
{
list.add(s);
continue;
}
if(s.length() - v < n)
{
stack.push(s + "(");
validationStack.push(v);
}
if(2 * v < s.length())
{
stack.push(s + ")");
validationStack.push(v+1);
}
}
return list;
}
}
v is the number of closed parenthesis.
if s.length - v < n, then the open parenthesis is still available. we can still add "(" to this string.
if 2*v < s.length, then the string has at least one open parenthesis that hasn't been matched. so ")" is needed.
if 2*v = s.length, then all open parenthesis are matched. nothing should be done, return back to the beginning of loop. pop a new string.
2*v > s.length is never gonna happen for the reason that it means a closed parenthesis is before any unmatched open one.
Note: the algorithm uses stack to avoid iteration. Every time, it pops the string, but one or more Strings are pushed to stack.