題目描述
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
(給出n對小括號,寫一個函數來生成所有的合理的小括號組合)
For example, given n = 3, a solution set is:
(例如,給出參數:3,結果如下:)
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
題目分析
該題是一個生成所有合理結果的題目,可以考慮使用遞歸的方法。我們先以人的思維來思考這個題目,這是一道從2n個括號的全排列中找出符合規則的排列,如果我們直接一個個排,在這個過程中,每一步選擇括號都是隨機的 (左括號或者右括號均可,在選擇完一步壁厚再去判斷當前的括號串是否已經不符合規則) ,例如先選擇一個左括號 ( ,在選擇一個右括號 ) ,此時 () 是合理的,而這時再加入一個右括號就不合理了
這大概就是以人爲排列的方式尋找結果的最普通的方式,我們要把這種方式用程序的形式構建出來,將左括號和右括號 分開 遞歸 分別 添加,只要左右括號還有剩餘就進行添加
n 對括號,把括號分成left=n個左括號,right=n個右括號,也分別代表剩餘的左、右括號數,在遞歸的過程中只需要遵循三個規則即可:
- 如果添加過一個括號之後發現,剩餘括號數量left>right,則說明已有的括號串中右括號的數量多於左括號,這中情況下括號串一定是不符合規則,例如 )() ()) 等等, 這一步就是用來剔除所有的不合法的括號串
- 如果發現left0 right0 此時形成的括號串即爲我們要的結果之一
- 只要left>0或者right>0,就可以繼續向括號串中添加括號
程序示例(javascript)
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
var res = []
generate(n, n, "", res)
return res
};
function generate(left, right, str, res){
if (left > right){
return
}
if(left===0 && right===0){
res.push(str)
return
}
if(left>0){
generate(left-1, right, str+"(", res)
}
if(right>0){
generate(left, right-1, str+")", res)
}
}