我们的目标
我们要做的就是找出所有可能的正确括号组合。比如,如果你有3对括号,那么可能的正确组合就有:"((()))", "(()())", "(())()", "()()()", "()(())"。
怎么做?
我们可以通过一个游戏来理解怎么做。想象一下你在玩一个堆叠积木的游戏,但是这里的积木有两种,一种是左边的积木(左括号),一种是右边的积木(右括号)。我们的规则是:
- 左边的积木必须总是先于右边的积木放下来。
- 任何时候都不能让右边的积木比左边的积木多。
游戏规则
- 开始游戏:我们有一个空的积木堆。
- 放积木:每次你可以选择放下一个左边的积木或者右边的积木,但是要记得规则。
- 结束游戏:当你放下了所有
n
对积木后,你就完成了这轮游戏,而且如果遵循了规则,你就得到了一个正确的组合。
如何编码这个游戏
现在我们来写一个程序来帮助我们玩游戏:
- 准备一个篮子:这个篮子用来装所有可能的好玩的积木组合。
- 游戏开始:我们的积木堆还是空的,我们还没有放任何积木。
- 放积木:我们可以尝试放下一个左积木,也可以尝试放下一个右积木(如果可以的话)。
- 检查积木堆:如果我们的积木堆达到了
2*n
高(因为我们有n
对积木),那么我们就找到了一个好玩的组合,把它放进篮子里。 - 重复步骤:一直重复放积木直到没有更多的积木可以放,或者直到我们把所有可能的组合都找出来为止。
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); } } }
这段代码就像是一个积木游戏,它会不断地尝试放积木,直到找到所有可能的好玩的组合。当你运行这个程序,它就会告诉你所有可能的括号组合。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。