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();
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);
}
}
public String[] generateParenthesis(int n) {
dfs(n, n, n, 0);
String[] result = new String[res.size()];
for (int i = 0; i < res.size(); i++) {
result[i] = res.get(i);
}
return result;
}
}
编程语言是Java。
该题考察的知识点包括:
- 递归
- 字符串操作
- 列表(ArrayList)的使用
代码的文字解释如下:
- 定义一个字符串构建器
path,用于构建每种括号组合。 - 实现一个递归函数
dfs,接受四个参数:u表示需要生成的括号对数,l表示当前已有的左括号数,r表示当前已有的右括号数,idx表示当前所在位置的索引。 - 在递归函数
dfs中,首先判断是否已经生成了指定数量的括号对(即path.length()是否等于u * 2),如果是,则将当前括号组合添加到结果列表res中,并返回。 - 分别处理两种情况:如果左括号数还未达到指定数量,可以在当前位置添加一个左括号,并递归调用 dfs 函数增加左括号数;如果左括号数小于右括号数(即还有可以匹配的左括号),可以在当前位置添加一个右括号,并递归调用 dfs 函数增加右括号数。
- 在递归函数
dfs中,完成每次递归后需要的清理工作,即将当前位置的括号删除(通过path.deleteCharAt(path.length() - 1))。 - 实现
generateParenthesis方法,接受一个整数n作为参数,并返回生成的括号组合数组。 - 在
generateParenthesis方法中,调用递归函数dfs来生成括号组合。
