[leetcode] Generate Parentheses

Posted Lin.B

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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个测试用例,感觉如果用第一种方法应该可以过,只是时间复杂度比较高。

递归大法好。

以上是关于[leetcode] Generate Parentheses的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]Generate Parentheses

LeetCode - 22. Generate Parentheses

LeetCode Generate Parentheses

leetcode22. Generate Parentheses

leetcode 22 -- Generate Parentheses

leetcode : generate parenthese