题解 | #牛圈围栏问题# java

牛圈围栏问题

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return string字符串一维数组
     */
    private List<String> res = new ArrayList<>();
    private StringBuilder path = new StringBuilder();

    public String[] generateParenthesis(int n) {
        dfs(n, n, n, 0);
        return res.toArray(new String[0]);
    }

    private void dfs(int u, int l, int r, int idx) {
        if (path.length() == u * 2) {
            res.add(path.toString());
            return;
        }
        if (l > 0) {
            path.append('(');
            dfs(u, l - 1, r, idx + 1);
            path.deleteCharAt(path.length() - 1);
        }
        if (l < r) {
            path.append(')');
            dfs(u, l, r - 1, idx + 1);
            path.deleteCharAt(path.length() - 1);
        }
    }
}

编程语言是Java。

该题考察生成括号序列的知识点。

代码逻辑解释:

  1. generateParenthesis方法接受一个整数n作为参数,返回一个字符串数组。
  2. 在dfs方法中,u表示总共需要生成的括号对数,l表示当前剩余的左括号数,r表示当前剩余的右括号数,idx表示当前位置。
  3. 如果path的长度等于u*2,说明已经生成了一组合法的括号序列,将其加入到res中,并返回。
  4. 如果l大于0,可以放置一个左括号,将其添加到path中,然后继续递归生成下一个位置的括号序列。
  5. 递归结束后,需要将刚才添加的左括号从path中删除,以便继续搜索其他可能的情况。
  6. 如果l小于r,可以放置一个右括号,将其添加到path中,然后继续递归生成下一个位置的括号序列。
  7. 递归结束后,需要将刚才添加的右括号从path中删除,以便继续搜索其他可能的情况。
全部评论

相关推荐

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