public static ParensResult GenerateParens(int count) { if (count < 0) { return(null); } RecursionCount rc = new RecursionCount(); char[] str = new char[count * 2]; List <string> list = new List <string>(); AddParen(list, count, count, str, 0, rc); return(new ParensResult() { list = list, recursionCount = rc.count }); }
private static void AddParen(List <string> list, int leftRem, int rightRem, char[] str, int index, RecursionCount rc) { rc.count++; if (leftRem < 0 || rightRem < leftRem) { // invalid state return; } if (leftRem == 0 && rightRem == 0) { list.Add(new string(str)); return; } str[index] = '('; AddParen(list, leftRem - 1, rightRem, str, index + 1, rc); str[index] = ')'; AddParen(list, leftRem, rightRem - 1, str, index + 1, rc); }
private static void AddParen2Count(List <string> list, int leftRemaining, int rightAvailable, char[] str, int index, RecursionCount rc) { rc.count++; if (leftRemaining == 0 && rightAvailable == 0) { list.Add(new string(str)); return; } if (leftRemaining > 0) { str[index] = '('; AddParen2Count(list, leftRemaining - 1, rightAvailable + 1, str, index + 1, rc); } if (rightAvailable > 0) { str[index] = ')'; AddParen2Count(list, leftRemaining, rightAvailable - 1, str, index + 1, rc); } }