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:
[
"( ( ( ) ) )",
"( ( ) ( ) )",
"( ( ) ) ( )",
"( ) ( ( ) )",
"( ) ( ) ( )"
]python
對於\(n\)對有效括號的生成,咱們能夠將其當作如下的方式:函數
注意在此過程當中,右括號的個數不能超過左括號,若是超過,則不往下進行遞歸。由此完成了一個回溯法的過程:遞歸生成括號,可是在生成括號的同時,檢查左右括號是否匹配。若是匹配,則繼續遞歸;若是不匹配,則不往下遞歸。在具體實現中,經過保證右邊括號的個數\(r\)始終小於等於左邊括號的個數來實現匹配的檢查。spa
將問題的解空間轉化爲圖或者樹的結構表示,而後利用深度優先搜索策略進行遍歷,遍歷過程當中記錄和尋找可行解和最優解。.net
回溯法的基本行爲是搜索,在搜索過程當中利用兩種方法來避免無效的搜索code
vector<string> generateParenthesis(int n) { vector<string> result; if(n==0) return result; backTrack(result, "", 0, 0, n); return result; } void backTrack(vector<string> &res,string curStr,int l, int r, int n){ if(r == n) res.push_back(curStr); //若是左括號沒有達到給定的n if(l < n) backTrack(res, curStr+"(", l+1, r, n); //若是右括號數目不夠 if(r < l) backTrack(res, curStr+")", l, r+1, n); }
[1]
[2] https://blog.csdn.net/zjc_game_coder/article/details/78520742orm