LeetCode:22. 括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

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

方法一:递归

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> liststr=new ArrayList();
 
        generateAll(new char[2*n],0,liststr);
        return liststr;
    }
    private static void generateAll(char[] cur,int i,List<String> liststr){  //递归
    	if(i==cur.length){
    		if(isvaild(cur))
    			liststr.add(String.valueOf(cur));
    	}
    	else{
    		cur[i]='(';
    		generateAll(cur,i+1,liststr);
    		cur[i]=')';
    		generateAll(cur,i+1,liststr);		  		
    	}
    }
    
    private static boolean isvaild(char[] cur){   //判断括号是否符合要求
    	int vaild=0;
    	for(int i=0;i<cur.length;i++){
    		if(cur[i]=='(')
    			vaild++;
    		else
    			vaild--;
    		if(vaild<0)
    			return false;
    	}
    	return (vaild==0);
    }
}

方法二:回溯

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> liststr=new ArrayList();
		generateAll(liststr,"",0,0,n);
		
		return liststr;
    }
    private static void generateAll(List<String> list,String str,int left,int right,int n){
		if(str.length()==n*2)
			list.add(str);
		else{
			//我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,
			//如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
			if(left<n)
				generateAll(list,str+"(",left+1,right,n);
			if(right<left)
				generateAll(list,str+")",left,right+1,n);
		}
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值