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

    代码如下:

     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 }
  • 相关阅读:
    java io 学习笔记(一)
    Centos中查看系统信息的常用命令
    arcgis影像批量裁剪代码
    VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
    VS中为什么不同的项目类型属性查看和设置的界面不一样
    C++函数中返回引用和返回值的区别
    java中HashMap的keySet()和values()
    repoquery详解——linux查看包依赖关系的神器
    linux学习笔记
    log4j的AppenderLayout格式符
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3780634.html
Copyright © 2020-2023  润新知