Generate Parentheses

原题链接:https://leetcode.com/problems/generate-parentheses/description/


思路:

这道题要求出n对括号能够正确排列的所有情况,重点是要找到符合条件排列的特点。我们可以将长度为2n的排列,看成是n个(与n个)一次次从左往右拼接而成。如果,这个排列是合理的,那么它有着如下的特点:

1. 在拼接符号的过程中,(的个数一定是小于等于)个数的。一旦出现)的个数大于(的情况,比如(())()),因为前6个符号已经匹配,可以等效为),后面哪怕再拼接(,也只会出现)(的情况,无济于事。

2.在拼接符号的过程中,(的个数一定要小于n,这个比较好理解,因为最终合理的匹配排列由n个(与n个)组成。

3.在满足1,2俩点的情况下,一直拼接,直到拼接成的字符串长度==2n,说明拼接成功。


其实是一个DFS,从输出的顺序也可以看出。


综合以上的分析,通过递归来实现,满足条件的字符串放到容器中,拼接过程中一旦出现不符合1,2两点的字符串就直接放弃。

其中open与close代表着字符串中含有的左右括号的个数。


public class GenerateParentheses {
    public List<String> generateParenthesis(int n) {
    	List<String> list = new ArrayList<String>();
    	backtrack(list, "", 0, 0, n);
    	return list;
    }

    private void backtrack(List<String> list, String str, int open, int close, int max) {
    	if(str.length() == 2*max) {
    		list.add(str);
    		return;
    	}
    	
    	if(open < max) {
    		backtrack(list, str+"(", open+1, close, max);
    	}
    	
    	if(close < open) {
    		backtrack(list, str+")", open, close+1, max);
    	}
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值