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:
"((()))", "(()())", "(())()", "()(())", "()()()"
題意:給定n對括號,生成所有合法的組合情況。
思路:合法的情況是,任意一時刻,左(“(”)括號數要大於等於右(")")括號數。關鍵在於題中只給了括號的對數,沒有形象的左右括號字符,如何在腦海中轉過彎去解題。故,在某次的調用中,
1)left大於right(left和right分別表示剩余左右括號的個數),即,臨時變量中右括號的數大於左括號的數,則說明出現了“)(”,這是非法情況,返回即可;
2)left和right都等於0說明,臨時變量中左右括號數相等,所以將臨時變量中的值存入res中;
3)其余的情況是,先放左括號,然后放右括號,然后遞歸。注意參數的更新。
參考了Grandyang的博客。代碼如下;
1 class Solution { 2 public: 3 vector<string> generateParenthesis(int n) 4 { 5 vector<string> res; 6 generateDFS(n,n,"",res); 7 return res; 8 } 9 10 /*left、right分別是左右括號剩下的括號數*/ 11 void generateDFS(int left,int right,string temp,vector<string> &res) 12 { 13 if(left>right) return; 14 if(left==0&&right==0) 15 res.push_back(temp); 16 else 17 { 18 if(left>0) 19 generateDFS(left-1,right,temp+'(',res); 20 if(right>0) 21 generateDFS(left,right-1,temp+')',res); 22 } 23 } 24 };
方法二:這種解法中left和right分別表示臨時變量中的左右括號數,這是和方法一不一樣的地方。先加入左括號,然后在右括號比左括號少,即合法的情況下,再加入右括號。參考 糖豆009。代碼如下:
1 class Solution { 2 public: 3 vector<string> generateParenthesis(int n) 4 { 5 vector<string> res; 6 string temp; 7 generateParenthesisDFS(n,0,0,temp,res); 8 return res; 9 } 10 11 void generateDFS(int n,int left,int right,string &temp,vector<string> & res) 12 { 13 if(left<n) 14 { 15 temp.push_back('('); 16 generateDFS(n,left+1,right,temp,res); 17 temp.pop_back(); 18 } 19 20 if(right<left) //避免出現右括號比左括號多的情況。 21 { 22 temp.push_back(')'); 23 generateDFS(n,left,right+1,temp,res); 24 temp.pop_back(); 25 } 26 if(temp.size()==n*2) 27 res.push_back(temp); 28 } 29 30 };
