我们的目标
我们要做的就是找出所有可能的正确括号组合。比如,如果你有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);
}
}
}
这段代码就像是一个积木游戏,它会不断地尝试放积木,直到找到所有可能的好玩的组合。当你运行这个程序,它就会告诉你所有可能的括号组合。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。

京公网安备 11010502036488号