Given parentheses

題目描述

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個右括號,也分別代表剩餘的左、右括號數,在遞歸的過程中只需要遵循三個規則即可:

  1. 如果添加過一個括號之後發現,剩餘括號數量left>right,則說明已有的括號串中右括號的數量多於左括號,這中情況下括號串一定是不符合規則,例如 )() ()) 等等, 這一步就是用來剔除所有的不合法的括號串
  2. 如果發現left0 right0 此時形成的括號串即爲我們要的結果之一
  3. 只要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)
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章