Generate Parentheses

225 篇文章 0 订阅
50 篇文章 0 订阅

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=3时候的情况:这里省略了一些中间步骤。



其实可以这么来看,影响递归条件的核心是括号的合法性。在打印的过程中要满足左括号的个数大于等于右括号的个数。(如“(()”,“(( ))”) 按照这个规则,我们设剩余的左括号个数为left,右括号剩余为right,如果 left right 都为0 说明打印完了,就可以将结果保存。如果left 剩的比right要多,那么不能够打印左括号,因为会违背规则,否则可以打印。如果left>0 可以直接打印左括号。

代码:

package leetcode;

import java.util.ArrayList;
import java.util.List;

public class GenerateParenthesis {

	public static void main(String[] args) {
		GenerateParenthesis g = new GenerateParenthesis();
	
		List<String> res =g.generateParenthesis(3);

		
		  for (String string : res) {
				System.out.println(string);
			}
	}
     public List<String> generateParenthesis(int n) {
    	 List<String> res = new ArrayList<String>();
    	  generate(n,n,"",res);
       
         return res;
    }
     
     public void generate(int left,int right,String temp,List<String> res){
    	 
    	 if(left ==0 && right == 0){
    		 res.add(temp);
    	 }
    	 if(left>0){
    		// System.out.println("add (");
    		 generate(left-1,right,temp+'(',res);
    	 }
    	 if(right>0 && right > left){
    		// System.out.println("add )");
    		 generate(left,right-1,temp+')',res);
    	 }
    	 
     }


}

对递归的理解还有待深入。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值