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:

    [
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]
    

    分析:题目要求找给定n情况下,匹配的括号。

    第一个想法,判断括号是否匹配想到用stack来做,但是这样的话就得先生成所有的组合,然后一一进行判断,时间复杂度肯定非常高。所以排除不用。

    第二个想法,递归的方法。为什么想到递归呢,也没法说清,因为括号要匹配,那么如果前面没有匹配上,后面肯定就不需要再比较了。有点像DFS的思想。就先跟着递归的思路看一下:

    设两个变量left,right分别代表字符串左括号的数量和右括号的数量。

    递归结束条件:if ( left == n && right == n )

    因为如果某个状态下,左括号小于右括号,那么肯定是错误的:if ( left < right )    break;

    接下来就需要判断在当前位置添加左括号还是右括号了:if( left < n ) 添加左括号 if( left > right ) 添加右括号

    代码如下:

     1 class Solution {
     2     List<String> res = new ArrayList<>();
     3     public List<String> generateParenthesis(int n) {
     4         helper(0,0,"",n);
     5         return res;
     6     }
     7     private void helper(int left, int right, String str, int n) {
     8         //递归结束条件
     9         if (left == n && right == n) {
    10             res.add(str);
    11             return;
    12         }
    13         if ( right > left ) return;
    14         if ( left < n )  helper(left+1,right,str+"(",n);
    15         if ( right < left ) helper(left,right+1,str+")",n);
    16     }
    17 }

    运行时间2ms。

    看了一下只有8个测试用例,感觉如果用第一种方法应该可以过,只是时间复杂度比较高。

    递归大法好。

  • 相关阅读:
    Codeforces Round #573 (Div. 2) C. Tokitsukaze and Discard Items
    Codeforces Round #573 (Div. 2) B
    练习2
    练习1
    上机练习4
    上机练习3
    上机练习1
    JAVA第一次作业
    es document的强制替换、创建、删除
    es 返回定制化的_source数据
  • 原文地址:https://www.cnblogs.com/boris1221/p/9655742.html
Copyright © 2011-2022 走看看