leetcode题目22: 括号生成(java)

题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例

输入:n = 3
输出:[
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]

解题思路

  • 利用二叉树的遍历。参考:https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/

代码

public List generateParenthesis(int n) {
    if (n <= 0) {
        return null;
    }
    List result = new ArrayList<>();
    dfs("", 0, 0, n, result);
    return result;
}

/**
 * @param prefix 当前的字符串
 * @param left   左括号用了几个
 * @param right  右括号用了几个
 * @param size   生成括号的对数
 * @param result 结果
 */
void dfs(String prefix, int left, int right, int size, List result) {
    if ( left == right && left == size) {
        // 左右括号使用的个数相同,并且都用完了,则是符合条件的括号组合。
        result.add(prefix);
        return;
    }
    if (left < right) {
        // 如果当前已使用左括号的数量小于右括号的数量,则无法形成有效的括号。直接return。
        return;
    }
    if (left < size) {
        dfs(prefix + "(", left + 1, right, size, result);
    }

    if (right < size) {
        dfs(prefix + ")", left, right + 1, size, result);
    }
}

你可能感兴趣的:(leetcode题目22: 括号生成(java))