描述
农场里有 n 头牛,农场主人需要给这些牛搭建一个圈形的围栏,每头牛都需要一个独立的空间。为了使得围栏更加稳定,农场主人决定使用木棍和铁链来固定围栏。每头牛的空间由一个木棍和两个铁链组成,且木棍和铁链的连接处必须是一个完整的括号。数字 n 代表牛的数量,请你设计一个函数,用于生成所有可能的并且稳定的围栏组合。
示例1
输入:3
返回值:["((()))","(()())","(())()","()(())","()()()"]
示例2
输入:1
返回值:["()"]
备注:
1 <= n <= 8
按照左括号较多靠前的顺序输出
知识点
回溯
Java题解
public class Solution {
public String[] generateParenthesis(int n) {
List<String> fences = new ArrayList<>();
backtrack(n, n, new StringBuilder(), fences);
return fences.toArray(new String[fences.size()]);
}
private void backtrack(int leftCount, int rightCount, StringBuilder current,
List<String> fences) {
if (leftCount == 0 && rightCount == 0) {
fences.add(current.toString());
return;
}
if (leftCount > 0) {
current.append("(");
backtrack(leftCount - 1, rightCount, current, fences);
current.deleteCharAt(current.length() - 1);
}
if (rightCount > leftCount) {
current.append(")");
backtrack(leftCount, rightCount - 1, current, fences);
current.deleteCharAt(current.length() - 1);
}
}
}
解题思路
首先,我们定义一个列表 fences,用于存储所有的围栏组合。
然后,我们使用回溯法来搜索所有的围栏组合。
在每一步中,我们可以选择放置一个木棍和两个铁链,或者放置一个铁链和一个木棍。如果放置后,当前的围栏组合仍然是合法的,则继续向下搜索。
当放置了 n 个木棍和 2n 个铁链后,表示已经生成了一个稳定的围栏组合,将围栏组合转换成字符串形式并将其加入到 fences 中。
递归结束后,将 fences 转换成字符串数组并返回结果。