题解 | #牛圈围栏问题# 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。
该题考察生成括号序列的知识点。
代码逻辑解释:
- generateParenthesis方法接受一个整数n作为参数,返回一个字符串数组。
- 在dfs方法中,u表示总共需要生成的括号对数,l表示当前剩余的左括号数,r表示当前剩余的右括号数,idx表示当前位置。
- 如果path的长度等于u*2,说明已经生成了一组合法的括号序列,将其加入到res中,并返回。
- 如果l大于0,可以放置一个左括号,将其添加到path中,然后继续递归生成下一个位置的括号序列。
- 递归结束后,需要将刚才添加的左括号从path中删除,以便继续搜索其他可能的情况。
- 如果l小于r,可以放置一个右括号,将其添加到path中,然后继续递归生成下一个位置的括号序列。
- 递归结束后,需要将刚才添加的右括号从path中删除,以便继续搜索其他可能的情况。