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');