[Leetcode] generate parentheses 生成括號


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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM