LeetCode Generate Parentheses(022)解法总结

605 阅读1分钟

描述

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:

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

思路

对于重复内容顺序的生成,可以采用递归的方式。生成括号部分可以进行递归,具体递归过程如下图:图源


如图,进行递归需要设计递归的出口,在本问题中,出口为右括号的数量超过左括号(非法情况)、左括号的数量等于右括号的数量等于0(合法情况,加入输出队列)。其他情况可以当做中间过程进行处理。

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> result = new LinkedList<String>();
        //递归的开始
        add(n, n, "", result);
        return result;
    }
    
    //前两个整型数据是剩余左右括号数,current为当前的组合,result为结果集
    public void add(int left, int right, String current, List<String> result){
        //如果剩余左括号数大于右括号,说明当前是非法情况
        if(left > right){
            return;
        }
        //完整的合法情况,左右括号组合完成
        if(left == 0 && right == 0){
            result.add(current);
            return;
        }
        //当左右括号不为0,分别尝试左右括号加上的情况
        if(left > 0){
            add(left-1, right, current+"(", result);
        }
        
        if(right > 0){
            add(left, right-1, current+")", result);
        }
    }
}
Runtime: 1 ms, faster than 82.00% of Java online submissions for Generate Parentheses.
Memory Usage: 39.8 MB, less than 17.42% of Java online submissions for Generate Parentheses.

解法的关键在于将穷举所有情况的思想转换为递归思想的过程。也是穷举法的一种方式。