题解 | #牛圈围栏问题#

牛圈围栏问题

https://www.nowcoder.com/practice/4e3bb97bbc2b4382a745abe953f44aee

知识点

回溯

解题思路

首先,我们定义一个列表 fences,用于存储所有的围栏组合。

然后,我们使用回溯法来搜索所有的围栏组合。

在每一步中,我们可以选择放置一个木棍和两个铁链,或者放置一个铁链和一个木棍。如果放置后,当前的围栏组合仍然是合法的,则继续向下搜索。

当放置了 n 个木棍和 2n 个铁链后,表示已经生成了一个稳定的围栏组合,将围栏组合转换成字符串形式并将其加入到 fences 中。

递归结束后,将 fences 转换成字符串数组并返回结果。

Java题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串一维数组
     */
    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);
        }
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务