[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
leetcode22. Generate Parentheses