// TODO: optimize /** * @param {number} n * @return {string[]} */ var generateParenthesis = function(n) { var i = 1, result = []; if (n === 0) { return result; } result.push('()'); while (i < n) { result = helper(result); i++; } return result; }; function helper(arr) { var len = arr.length, result = [], len1, curStr, tmp, i, j; len1 = arr[0].length; for (i = 0; i < len; i++) { curStr = arr[i]; for (j = 0; j < len1; j++) { tmp = curStr.substring(0, j) + '()' + curStr.substring(j); if (result.indexOf(tmp) === -1) { result.push(tmp); } } } return result; }