zoukankan      html  css  js  c++  java
  • 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:

    "((()))", "(()())", "(())()", "()(())", "()()()"


    所有组合的个数其实是一个卡特兰数

    我们这样来构造一个合法的字符串:首先第一个位置肯定是“(”,对于后面位置:

    1、如果前一个字符是“(”:那么我们可以在当前位置上加入“)”(字符“)”一定有剩余);如果“(”字符还有剩余,也可以在当前位置加入“(”                          本文地址

    2、如果前一个字符是“)”:如果当前“(”和“)”剩余的数目不同(即其那面的括号没有完全匹配),可以在当前位置上加入“)”;如果“(”字符还有剩余,也可以在当前位置加入“(”

     1 class Solution {
     2 public:
     3     vector<string> generateParenthesis(int n) {
     4         string tmpres(n<<1, '(');
     5         vector<string> res;
     6         helper(1, tmpres, res, n-1, n);
     7         return res;
     8     }
     9 private:
    10     void helper(int index, string &tmpres, vector<string>&res, int leftNum, int rightNum)
    11     {
    12         if(index >= tmpres.size()){res.push_back(tmpres); return;}
    13         if(tmpres[index-1] == '(')
    14         {
    15             tmpres[index] = ')';
    16             helper(index+1, tmpres, res, leftNum, rightNum-1);
    17             if(leftNum > 0)
    18             {
    19                 tmpres[index] = '(';
    20                 helper(index+1, tmpres, res, leftNum-1, rightNum);
    21             }
    22         }
    23         else
    24         {
    25             if(leftNum != rightNum)
    26             {
    27                 tmpres[index] = ')';
    28                 helper(index+1, tmpres, res, leftNum, rightNum-1);
    29             }
    30             if(leftNum > 0)
    31             {
    32                 tmpres[index] = '(';
    33                 helper(index+1, tmpres, res, leftNum-1, rightNum);
    34             }
    35         }
    36     }
    37 };

    其实对于某个合法的字符串,我们可以发现从合法字符串的任何一个位置看,“(”的数目 >= ")"的数目,即剩余的“(”的数目 <= 剩余的")"数目, 因此就有以下更加简洁的代码

     1 class Solution {
     2 public:
     3     vector<string> generateParenthesis(int n) {
     4         string tmpres;
     5         vector<string> res;
     6         helper(tmpres, res, n, n);
     7         return res;
     8     }
     9 private:
    10     void helper(string &tmpres, vector<string>&res, int leftNum, int rightNum)
    11     {
    12         if(leftNum > rightNum)return;
    13         if(leftNum == 0 && rightNum == 0)
    14         {
    15             res.push_back(tmpres);
    16             return;
    17         }
    18         if(leftNum > 0)
    19         {
    20             tmpres.push_back('(');
    21             helper(tmpres, res, leftNum-1, rightNum);
    22             tmpres.pop_back();
    23         }
    24         if(rightNum > 0)
    25         {
    26             tmpres.push_back(')');
    27             helper(tmpres, res, leftNum, rightNum-1);
    28             tmpres.pop_back();
    29         }
    30     }
    31 };

     

     【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3776583.html

  • 相关阅读:
    Generate profile vspx
    (转)Connect string 中的 Intergrated Security
    删除数据库
    SQL Server问题之The remote procedure call failed. [0x800706be]
    SQL Server 2008 R2如何开启数据库的远程连接
    ubuntu 12.04 sourcelist 更新源
    Ubuntu12.04 命令gedit出错:Could not connect to session bus (
    解决 Ubuntu 12.04 无法调节屏幕亮度的问题
    Eclipse和PyDev搭建完美Python开发环境(Windows篇)
    raw_input() 与 input() __ Python
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3776583.html
Copyright © 2011-2022 走看看