括号生成
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 22 ms, 内存: 16.3 MB
/*
* 思路:使用递归来生成所有有效的括号组合。我们可以维护两个计数器:
* 一个记录当前左括号的数量,另一个记录右括号的数量。只有当左括号数量少于 n 时,
* 我们才可以添加左括号;只有当右括号数量少于左括号数量时,我们才可以添加右括号。
* 使用Java Streams将结果转换成一个列表。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GenerateParenthesesStream {
public List<String> generateParenthesis(int n) {
return backtrack("", 0, 0, n).collect(Collectors.toList());
}
private Stream<String> backtrack(String current, int open, int close, int max) {
if (current.length() == max * 2) {
return Stream.of(current);
}
Stream<String> result = Stream.empty();
if (open < max) {
result = Stream.concat(result, backtrack(current + "(", open + 1, close, max));
}
if (close < open) {
result = Stream.concat(result, backtrack(current + ")", open, close + 1, max));
}
return result;
}
public static void main(String[] args) {
GenerateParenthesesStream gps = new GenerateParenthesesStream();
System.out.println(gps.generateParenthesis(3));
}
}
解释
方法:
这个题解采用了递归加记忆化的方法来生成所有有效的括号组合。基本思路是使用深度优先搜索(DFS),递归地构建每一种可能的括号组合。对于给定的n(括号对数),函数dfs(n)返回所有由n对括号构成的有效组合。递归的基准情况是当n等于0时,只有一个有效的组合,即空字符串。对于n>0的情况,通过枚举左侧括号内包含的括号对数i(从0到n-1),然后对于每个i,计算左侧括号内的组合和右侧的组合,然后将它们组合成一个有效的括号表达式。采用记忆化是为了避免重复计算已经解决的子问题,提高效率。
时间复杂度:
O(C_n * n)
空间复杂度:
O(C_n * n)
代码细节讲解
🦆
在递归函数中,为何选择枚举左侧括号内包含的括号对数i,而不是简单地每次只添加一对括号?
▷🦆
记忆化存储(使用cache装饰器)具体是如何避免重复计算的,能否详细解释其工作原理?
▷🦆
题解中提到的Catalan数与此问题有何关联,能否详细解释Catalan数在此算法中的作用和意义?
▷