CtCI 8.9 - Parens

Given 'n' pair of parentheses, print all valid combinations

HTML

<pre id="output"></pre>

JavaScript

var counter = 0;

function addParen(list, leftRem, rightRem, charArray, count) {
    counter++;
    console.log(counter, leftRem, rightRem, charArray.join(''), count);
    // Invalid case
    if (leftRem < 0 || rightRem < leftRem) return;

    // Termination
    if (leftRem === 0 && rightRem === 0) {
        list.push(charArray.join(''));
        console.log(' >> Added one to the result array ');
    } else {
        // Add left paren if there are any remining left parens
        if (leftRem > 0) {
            charArray[count] = '(';
            console.log('Recursing after adding LEFT');
            console.log(counter, leftRem, rightRem, charArray.join(''), count, ' >>>');
            addParen(list, leftRem - 1, rightRem, charArray, count + 1);
        }

        // Add right paren, if expression is valid
        if (rightRem > leftRem) {
            charArray[count] = ')';
            console.log('Recursing after adding RIGHT');
            console.log(counter, leftRem, rightRem, charArray.join(''), count, '>>>');
            addParen(list, leftRem, rightRem - 1, charArray, count + 1);
        }
    }
}

function generateParens(n) {
    var result = [],
        charArray = new Array(n * 2);
    addParen(result, n, n, charArray, 0);
    return result;
}

var result = generateParens(2);
document.querySelector('#output').innerHTML = result.join('\n');