每日一题:22. 括号生成

103 阅读1分钟

package com.ljp.test.leetcode;

import java.util.ArrayList; import java.util.List;

/**

  • 22. 括号生成

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

  • 示例 1:

  • 输入:n = 3

  • 输出:["((()))","(()())","(())()","()(())","()()()"]

  • 示例 2:

  • 输入:n = 1

  • 输出:["()"]

  • 提示:

  • 1 <= n <= 8

  • 来源:力扣(LeetCode)

  • 链接:22. 括号生成

  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */ public class Number0022 {

    public static void main(String[] args) { System.out.println(BacktrackAndPruning.generateAllParentheses(1)); System.out.println(BacktrackAndPruning.generateAllParentheses(2)); System.out.println(BacktrackAndPruning.generateAllParentheses(3)); System.out.println(BacktrackAndPruning.generateAllParentheses(4)); System.out.println(BacktrackAndPruning.generateAllParentheses(5)); }

    /**

    • 使用回溯算法和剪枝算法 */ private static class BacktrackAndPruning {

      public static List generateAllParentheses(int n) { List allParentheses = new ArrayList<>(); backtrackAndPruning(allParentheses, new StringBuilder(), 0, 0, n); return allParentheses; }

      /**

      • 回溯算法和剪枝算法
      • @param allParentheses 所有括号集合
      • @param parentheses 单个括号(值传递,复制的引用)
      • @param open 左括号(值传递)
      • @param close 右括号(值传递)
      • @param max 最大括号数 */ private static void backtrackAndPruning(List allParentheses, StringBuilder parentheses, int open, int close, int max) { // 剪枝算法 if (open > max || open < close) { return; } if (parentheses.length() == max * 2) { allParentheses.add(parentheses.toString()); return; } // 回溯算法,左增加 backtrackAndPruning(allParentheses, parentheses.append('('), open + 1, close, max); // 回溯结束之后,StringBuilder置空 parentheses.deleteCharAt(parentheses.length() - 1); // 回溯算法,右增加 backtrackAndPruning(allParentheses, parentheses.append(')'), open, close + 1, max); // 回溯结束之后,StringBuilder置空 parentheses.deleteCharAt(parentheses.length() - 1); }

    }

}