leetcode 括號生成
阿新 • • 發佈:2018-12-13
題目描述:
給出 n 代表生成括號的對數,請你寫出一個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解題思路:
回溯法。搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。括號生成規律:
1)右括號等於n,即對數時,即找到一對;
2)左括號小於n,可以新增左括號;
3)左括號大於右括號個數時,新增右括號。
符合上述規律生成的樹如下:
C++程式碼:
class Solution { public: vector<string> generateParenthesis(int n) { vector<string> res; helper("",res,n,0,0); return res; } /*回溯法解決該問題 回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。” */ void helper(string cur, vector<string> &res, int n, int left, int right) { //因為right是右括號,數量=n 表明此時已經找到一個結果 if (right == n) { res.push_back(cur); } //可以新增一個左括號 if (left < n) { helper(cur+'(',res,n,left+1,right); } //新增一個右括號 if (right < left) { helper(cur+')',res,n,left,right+1); } } };