题解 | #牛圈围栏问题#

103 阅读1分钟

描述

农场里有 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 转换成字符串数组并返回结果。