我们的目标

我们要做的就是找出所有可能的正确括号组合。比如,如果你有3对括号,那么可能的正确组合就有:"((()))", "(()())", "(())()", "()()()", "()(())"。

怎么做?

我们可以通过一个游戏来理解怎么做。想象一下你在玩一个堆叠积木的游戏,但是这里的积木有两种,一种是左边的积木(左括号),一种是右边的积木(右括号)。我们的规则是:

  1. 左边的积木必须总是先于右边的积木放下来。
  2. 任何时候都不能让右边的积木比左边的积木多。

游戏规则

  1. 开始游戏:我们有一个空的积木堆。
  2. 放积木:每次你可以选择放下一个左边的积木或者右边的积木,但是要记得规则。
  3. 结束游戏:当你放下了所有 n 对积木后,你就完成了这轮游戏,而且如果遵循了规则,你就得到了一个正确的组合。

如何编码这个游戏

现在我们来写一个程序来帮助我们玩游戏:

  1. 准备一个篮子:这个篮子用来装所有可能的好玩的积木组合。
  2. 游戏开始:我们的积木堆还是空的,我们还没有放任何积木。
  3. 放积木:我们可以尝试放下一个左积木,也可以尝试放下一个右积木(如果可以的话)。
  4. 检查积木堆:如果我们的积木堆达到了 2*n 高(因为我们有 n 对积木),那么我们就找到了一个好玩的组合,把它放进篮子里。
  5. 重复步骤:一直重复放积木直到没有更多的积木可以放,或者直到我们把所有可能的组合都找出来为止。

Java 代码

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

public class ParenthesesGame {

    /**
     * 生成所有可能的括号组合
     * @param n 需要生成的括号对数
     * @return 所有的括号组合列表
     */
    public ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> combinations = new ArrayList<>(); // 这就是我们的篮子
        buildCombinations(combinations, "", 0, 0, n); // 开始游戏
        return combinations;
    }

    /**
     * 帮助我们放积木
     * @param combinations 放好积木后的组合
     * @param current 当前的积木堆
     * @param open 当前左积木的数量
     * @param close 当前右积木的数量
     * @param max 总共需要放置的最大积木对数
     */
    private void buildCombinations(ArrayList<String> combinations, String current, int open, int close, int max) {
        // 如果积木堆高度达到了两倍的max,说明我们完成了一个组合
        if (current.length() == max * 2) {
            combinations.add(current);
        } else {
            // 尝试放下一个左积木
            if (open < max) {
                buildCombinations(combinations, current + "(", open + 1, close, max);
            }
            // 只有当右积木数量少于左积木数量时才能放下一个右积木
            if (close < open) {
                buildCombinations(combinations, current + ")", open, close + 1, max);
            }
        }
    }

    public static void main(String[] args) {
        ParenthesesGame game = new ParenthesesGame();
        ArrayList<String> result = game.generateParenthesis(3);
        for (String s : result) {
            System.out.println(s);
        }
    }
}

这段代码就像是一个积木游戏,它会不断地尝试放积木,直到找到所有可能的好玩的组合。当你运行这个程序,它就会告诉你所有可能的括号组合。

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。