【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=2的情况如下图所示:

【leetcode】Generate Parentheses

代码如下:

 1 class Solution {

 2 public:

 3     vector<string> generateParenthesis(int n) {

 4         vector<string> answer;

 5         string s = "";

 6         recursive(answer,n,n,s);

 7         

 8         return answer;

 9     }

10     void recursive(vector<string>& answer,int leftp,int rightp,string s){

11         if(leftp == 0 && rightp == 0)

12             answer.push_back(s);

13         if(leftp > 0)

14         {

15             recursive(answer,leftp-1,rightp,s+'(');

16         }

17         if(rightp >0 && leftp < rightp)

18         {

19             recursive(answer,leftp,rightp-1,s+')');

20         }

21     }

22 };

上述代码中有一点要注意的就是在递归的过程中三个if不是互相独立的关系,就是说不是每次只进一个if,有可能从第一个if递归调用返回以后还要进入下一个if,所以在递归调用过程中不能改变s,leftp或者rightp的值,而只能在传递参数的时候体现出变化。如果把上述第二个if写成如下形式,就会发生错误:

1  if(leftp > 0)

2 {

3       s += '('

4        recursive(answer,leftp-1,rightp,s);

5 }

因为这样从第二个if递归返回后再进入第三个if的时候s已经多加了一个'(',不是最初进入函数时候的s了。

 JAVA版本代码:

 1 public class Solution {

 2     public List<String> generateParenthesis(int n) {

 3         StringBuffer current = new StringBuffer();

 4         generateHelper(current, 0, 0,n);

 5         return answer;

 6     }

 7     List<String> answer = new ArrayList<String>();

 8     private void generateHelper(StringBuffer current,int leftp,int rightp,int n){

 9         if(leftp == n && rightp == n)

10         {

11             String temp = current.toString();

12             answer.add(temp);

13             return;

14         }

15         

16         if(leftp < n){

17             current.append('(');

18             generateHelper(current, leftp+1, rightp,n);

19             current.deleteCharAt(current.length()-1);

20         }

21         

22         if(rightp < n  && rightp < leftp){

23             current.append(')');

24             generateHelper(current, leftp, rightp+1,n);

25             current.deleteCharAt(current.length()-1);

26         }

27     }

28 }

 

 

你可能感兴趣的:(LeetCode)