Java n对括号的组合
我有一个非常基本的问题,关于打印n对括号的所有有效组合的算法。 我打印出了l、r和字符串s的值。但是对于下面的代码,在打印出第一个组合(())之后,l和r的值如何变成1和0,以便可以开始第二个组合()Java n对括号的组合,java,algorithm,Java,Algorithm,我有一个非常基本的问题,关于打印n对括号的所有有效组合的算法。 我打印出了l、r和字符串s的值。但是对于下面的代码,在打印出第一个组合(())之后,l和r的值如何变成1和0,以便可以开始第二个组合() l和r是左括号,右括号,我希望得到的结果是:(()),(),这是两对括号的两种组合。但是这段代码如何获得第二个组合()?谢谢运行您的代码,我不确定这是否正是您想要的 但如果是,这里是我在上面提供的链接中代码的Java端口 public class Test0010 { public s
l和r是左括号,右括号,我希望得到的结果是:(()),(),这是两对括号的两种组合。但是这段代码如何获得第二个组合()?谢谢运行您的代码,我不确定这是否正是您想要的 但如果是,这里是我在上面提供的链接中代码的Java端口
public class Test0010 {
public static void main(String[] a) {
brackets(5);
}
public static void brackets(int n) {
for (int i = 1; i <= n; i++) {
brackets("", 0, 0, i);
}
}
private static void brackets(String output, int open, int close, int pairs) {
if ((open == pairs) && (close == pairs)) {
System.out.println(output);
} else {
if (open < pairs)
brackets(output + "(", open + 1, close, pairs);
if (close < open)
brackets(output + ")", open, close + 1, pairs);
}
}
}
公共类Test0010{
公共静态void main(字符串[]a){
括号(5);
}
公共静态空括号(int n){
对于(int i=1;i我相信这就是你想要的:
为了打印n对括号,我们观察到总共有n个open和n个close括号
因此,您发布的代码以2 open和0 close括号开始
想象一下画一棵树,在每种状态下,我们可以进入两个不同的方向:
- 打印另一个开括号->减少l->这样所需的闭括号数将增加,以使表达式有效->增加r
- 如果r>0->减小r,则打印一个右括号
因此,我们可以将状态可视化如下:
从(l=2,r=0)开始,它进入(1,1),在这种状态下,它被分为两种状态:(0,2)和(1,0)。因此,代码将进一步分解,直到l=0和r=0打印结果。希望您理解!当然,您形成所有格式良好的括号的方式非常复杂,下面是一个更直观的递归定义:-
S(N) = '('+S(N-1)+')'
or
S(N) = "()"+S(N-1)
以下是使用上述递归定义的伪代码:-
void parenthesis(int l,int r,char[] result) {
if(l<r) {
result[l] = '(';
result[r] = ')';
parenthesis(l+1,r-1,result);
result[l] = '(';
redult[l+1] = ')';
parenthesis(l+2,r,result);
}
else {
print(result);
}
}
parenthesis(0,2*N-1,new char[2*N]);
void括号(int l,int r,char[]result){
如果这个问题不是很清楚。什么是l
,什么是r
,什么是“n对”为什么你希望这个算法能工作?检查这些链接。希望你能把它翻译成Java。为了提出一个好的问题,你应该包括可能的输入和预期的输出。我会尝试以某种方式将配对映射到二进制数的位,并将(重复递增的)数解释为“build”每个set.l和r都是左/右括号,我希望得到的结果是:(()),(),这是两对括号的两个组合
void parenthesis(int l,int r,char[] result) {
if(l<r) {
result[l] = '(';
result[r] = ')';
parenthesis(l+1,r-1,result);
result[l] = '(';
redult[l+1] = ')';
parenthesis(l+2,r,result);
}
else {
print(result);
}
}
parenthesis(0,2*N-1,new char[2*N]);