码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode] Generate Parentheses

时间:2018-09-16 15:27:45      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:代码   想法   air   dfs   public   esc   fun   方法   desc   

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个测试用例,感觉如果用第一种方法应该可以过,只是时间复杂度比较高。

递归大法好。

[leetcode] Generate Parentheses

标签:代码   想法   air   dfs   public   esc   fun   方法   desc   

原文地址:https://www.cnblogs.com/boris1221/p/9655742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!