leetcode題庫——括號生成
阿新 • • 發佈:2018-11-11
題目描述:
給出 n 代表生成括號的對數,請你寫出一個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
方法:DFS+剪枝
class Solution { public: int numl=1; int numr=0; string str="("; int deep=1; vector<string> s; vector<string> ans; vector<string> generateParenthesis(int n) { if(n==1) { ans.push_back("()"); return ans; } int num=n; s.push_back("("); for(int i=1;i<n;i++) s.push_back("()"); dfs(numl,numr,str,n,num); return ans; } void dfs(int numl,int numr,string str,int n,int num) { if(deep<2*n-1) { for(int i=0;i<2;i++) { if(numl>=numr&&numl<=num) { if(i==0) dfs(numl+1,numr,str+s[deep].substr(i,1),deep+1,num); if(i==1) dfs(numl,numr+1,str+s[deep].substr(i,1),deep+1,num); } else continue; } } if(numl==num&&numr==num) ans.push_back(str); } };
思路:
首先,將n對括號對應的“搜尋樹” 建立出來,例如:n=3時,建立一個vector<string>s,s=['(','()','()','()','()','()'],這樣,對應的搜尋樹就是這樣:
深搜時,設定兩個計數器,分別記錄左括號和右括號的數量,當i=0時,左括號+1;i=1時,右括號+1。當左括號數量大於3或者左括號數量大於右括號時,進行剪枝(也就是不繼續往下搜尋了,回溯到上一個遞迴中繼續搜尋)。