zoukankan      html  css  js  c++  java
  • [LeetCode] 22. Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

    Example 1:

    Input: n = 3
    Output: ["((()))","(()())","(())()","()(())","()()()"]
    

    Example 2:

    Input: n = 1
    Output: ["()"]

    Constraints:

    • 1 <= n <= 8

    括号生成。

    题意是给一个数字N,请返回由N对括号组成的所有可能的括号对。这是典型的backtracking回溯类的题目,基础题,一定要会。思路是创建一个helper函数表示当前拼接的情况cur,剩下的left括号数量和剩下的right括号数量。

    • 任何时候,如果left剩下的比right多(说明递归过程中多加了right),一定不对,则跳出递归
    • 如果left和right都用完则跳出递归函数并加入当前结果到结果集
    • 如果left还有,则left--继续递归
    • 如果right还有,则right--继续递归

    时间O(4的N次方除以根号N) - 这是卡特兰数的性质

    空间O(4的N次方除以根号N)

    Java实现

     1 class Solution {
     2     public List<String> generateParenthesis(int n) {
     3         List<String> res = new ArrayList<>();
     4         helper(res, "", n, n);
     5         return res;
     6     }
     7 
     8     private void helper(List<String> res, String cur, int left, int right) {
     9         if (left > right) {
    10             return;
    11         }
    12         if (left == 0 && right == 0) {
    13             res.add(cur);
    14             return;
    15         }
    16         if (left > 0) {
    17             helper(res, cur + "(", left - 1, right);
    18         }
    19         if (right > 0) {
    20             helper(res, cur + ")", left, right - 1);
    21         }
    22     }
    23 }

    JavaScript实现

     1 /**
     2  * @param {number} n
     3  * @return {string[]}
     4  */
     5 var generateParenthesis = function(n) {
     6     let res = [];
     7     var helper = function(left, right, cur) {
     8         // corner case
     9         if (left > right) {
    10             return;
    11         }
    12 
    13         // normal case
    14         if (left == 0 && right == 0) {
    15             res.push(cur);
    16             return;
    17         }
    18         if (left > 0) {
    19             helper(left - 1, right, cur + '(');
    20         }
    21         if (right > 0) {
    22             helper(left, right - 1, cur + ')');
    23         }
    24     };
    25     helper(n, n, '');
    26     return res;
    27 };

    LeetCode 题目总结

  • 相关阅读:
    一个贼基础的 编码解码方式
    SQL 中循环、for循环、游标
    sql中判断是否存在 数据库、表、存储过程、函数
    sql 同步表或同步表的时候更改部分字段
    sql存储过程的建立
    POJ
    UCloud 的安全秘钥 (计蒜客初赛第五场)(待解决)
    UCloud 机房的网络搭建(计蒜客初赛第五场)
    2017 计蒜之道 初赛 第四场
    腾讯课堂的物理实验(2017计蒜客初赛第三场)
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12631822.html
Copyright © 2011-2022 走看看