Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:回溯算法,在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集。其中需要明确三点:选择 (Options),限制 (Restraints),结束条件 (Termination)。
对于这道题来说,总共有以下的考虑
1.选择:
左括号。
右括号。
2.限制:
如果左括号已经用完了,则不能再加左括号了。
如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。
3.结束条件:
左右括号都已经用完。
代码:
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
var res = [];
backtrack('', n, n, res);
function backtrack(tempList, left, right, res){
if(left===0 && right===0){
res.push(tempList);
return;
}
if(left>right) return;
if(left>0){
backtrack(tempList+"(", left-1, right, res);
}
if(right>0){
backtrack(tempList+")", left, right-1, res);
}
}
return res;
};