题解 | #牛圈围栏问题#
牛圈围栏问题
https://www.nowcoder.com/practice/4e3bb97bbc2b4382a745abe953f44aee?tpId=354&tqId=10594750&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D354
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串一维数组
*/
public String[] generateParenthesis (int n) {
// write code here
List<String> result = new ArrayList<>();
backtrack(result, "", 0, 0, n);
return result.toArray(new String[0]);
}
private void backtrack(List<String> result, String current, int openCount, int closeCount, int n) {
if (current.length() == 2 * n) {
result.add(current);
return;
}
if (openCount < n) {
backtrack(result, current + "(", openCount + 1, closeCount, n);
}
if (closeCount < openCount) {
backtrack(result, current + ")", openCount, closeCount + 1, n);
}
}
}
知识点分析:
- 回溯算法:通过递归生成所有可能的括号组合。
- 递归:在每一步中,通过添加 '(' 或 ')' 来扩展当前的括号序列。
- 限制条件:在生成括号序列时,需要满足每个位置上的 ')' 数量不超过对应位置上的 '(' 数量。
解题思路:
在代码中,我们通过回溯算法递归地生成所有可能的括号组合。每次递归调用时,我们可以选择添加 '(' 或 ')',但需要确保不违反限制条件。当括号序列长度达到 2 * n 时,我们将其加入结果列表中。
