您的位置:首页 > 其它

LeetCode (22): Generate Parentheses

2015-09-30 13:08 387 查看

链接: https://leetcode.com/problems/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,要求写一个方法,生成所有n个括号的可能合法组合。

例如,n=3, 那么3个括号的所有可能组合如上。

————————————————————————————————————————————————————————————

【初始思路】

基本素养,只要见到求所有可能组合的情况(所有可能组合的个数), 首先立马想几个概念词:DFS、递归、回溯。有了这个直觉,你就省去了大量的时间,直接往递归上去套。接下来就是考虑怎么设计递归函数的问题了,速度自然会快很多。

这个题也是如此,回溯、递归。

怎么递归。

我开始的想法是,既然是合法组合,我干脆每次递归的时候直接选择一整个"()"组合作为递归添加项目就可以了。这样子不用考虑不合法的情况了。例如,要求2个括号的合法组合,那么先给一个括号,然后在这个括号的基础上,加第二个括号,无非有如下3种加法,我们用数字来表示可以填入第二个括号的位置:

0 1 2

也就是说,我们可以在0、1、2三个位置填入第二个括号,就能生成所有组合了。当然,填入2和填入0的效果是一样,后面讨论如何去重这种情况。

如果如题目要求,n=3时,那么可能的填入情况如下:

public class OtherSolution {
/**
* 定义全局变量,无需再传值到各个方法
*/
static List<String> list = new ArrayList<String>();

public static List<String> generateParenthesis(int n) {
/**
* 初始状态,左括号和右括号都可以添加n个,所以左右都传了n
*/
generateLeftsAndRights("",n,n);
return list;
}

/**
* DFS方法
* 该方法的本质是,每次调用都深度优先用掉左括号,然后再用掉右括号.
* @param subList 记录每次递归时候当前串, 方法将在subList上继续添加括号
* @param left 左括号还剩下的个数
* @param right 右括号还剩下的个数
*/
private static void generateLeftsAndRights(String subList,int left, int right){
/**
* 最后可能出现的情况, 右括号比左括号先用完, 明显不是合法的串,应剔除
*/
if(left > right) return;

/**
* 左括号还剩得有, 优先用左括号
* 该方法将不断深搜, 直到左括号全部用完
*/
if(left > 0){
generateLeftsAndRights(subList + "(", left-1, right);
}

/**
* 开始用右括号
*/
if(right > 0){
generateLeftsAndRights(subList + ")", left, right-1);
}

/**
* 基准情况, 各自都用完, 说明已经形成了一个合法的串,将该串加入list返回
*/
if(left == 0 && right == 0){
list.add(subList);
return;
}
}
}


generateParenthesis

最后,重申,凡是遇到要求全部可能集合、可能性、可能性个数的题目,立马考虑递归回溯求解!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: